Windows 版 OpenSSHって知ってます？

## Windows 版の OpenSSH とは？
Windows 版の OpenSSH は、GitHub 上で開発が進められており、Windows 10 1809、Windows Server 2019 以降の OS では OpenSSH のインストールが可能となっています。

OpenSSH Client が、プリインストールされている OS バージョンもありますので、特にインストール作業なしで使用することができます。ただ、インストールされているバージョンは、GitHub で公開されている最新バージョンではないため、最新の脆弱性対応や不具合修正が行われておりません。

Windows版の OpenSSH については、Microsoft の Web サイトに情報がありますので、目を通しておくといいと思います。

OpenSSH for Windows overview | Microsoft Learn
https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh-overview

今回は、一部の OS にプリインストールされている OpenSSH をアンインストールし、GitHub で公開されているバージョンをインストールする方法を紹介します。特に難しいことはありませんので、さくっと終わらせることができると思います。

## プリインストールされている OpenSSH をアンインストール
まず、使用している端末に OpenSSH がインストールされているか確認します。PowerShell から以下のコマンドを実行し、**Installed** になっているかどうかで判断できます。
```powershell
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'

#実行結果例
# Name  : OpenSSH.Client~~~~0.0.1.0
# State : Installed

# Name  : OpenSSH.Server~~~~0.0.1.0
# State : NotPresent
```
この場合は、OpenSSH Client が、インストールされています。GitHub で公開されているバージョンを使いたいので、**Installed** となっている OpenSSH.Client または OpenSSH.Server を以下の PowerShell コマンドにより、アンインストールします。

```powershell
# Uninstall the OpenSSH Client
Remove-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

# Uninstall the OpenSSH Server
Remove-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
```
コマンドを実行後、OS を再起動し、アンインストールを環境させてください。ちなみに OS を再起動する前は、**UninstallPending** という状態になってます。

```powershell
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'

# 実行結果例
# Name  : OpenSSH.Client~~~~0.0.1.0
# State : UninstallPending

# Name  : OpenSSH.Server~~~~0.0.1.0
# State : NotPresent
```

## GitHub 版 OpenSSH のインストール
### 1. GitHub から OpenSSH のインストーラーをダウンロード
GitHub のリリースページから、インストーラー（.msi）をダウンロードしてください。

Releases · PowerShell/Win32-OpenSSH
https://github.com/PowerShell/Win32-OpenSSH/releases

特に希望がなければ、最新版のインストーラーがいいと思います。
バージョン 9.5.0.0 の場合は、ARM64、Win32、Win64 がありますが、Arm の CPU を使用している場合は、ARM64版、それ以外の 32 bit 版 OS の場合は Win32、64 bit 版 OS の場合は Win64 をダウンロードしてください。

- OpenSSH-ARM64-v9.5.0.0.msi
- OpenSSH-Win32-v9.5.0.0.msi
- OpenSSH-Win64-v9.5.0.0.msi

### 2. インストーラー（.msi）から OpenSSH をインストール
GUI でのインストール方法は、用意されていないらしいので、[msiexec](https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/msiexec) コマンドを使用してインストールを実施します。インストールに関するコマンドは以下になります。

```powershell
# SSH Client と SSH Server の両方をインストール（デフォルト設定）
msiexec /i "path to openssh.msi"

# SSH Client のみインストール
msiexec /i "path to openssh.msi" ADDLOCAL=Client

# SSH Server のみインストール
msiexec /i "path to openssh.msi" ADDLOCAL=Server

# SSH Client のみアンインストール
msiexec /i "path to openssh.msi" REMOVE=Client

# SSH Server のみアンインストール
msiexec /i "path to openssh.msi" REMOVE=Server
```

OpenSSH Client のみインストールする時の実行例は、以下になります。
```powershell:実行例
msiexec /i OpenSSH-Win64-v9.5.0.0.msi ADDLOCAL=Client
```

インストールが完了したかは、[Get-Command](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/get-command) の実行結果が正しく返ってくるかで確認できます。

```powershell
Get-Command ssh | fl *

<# 実行結果例
HelpUri            :
FileVersionInfo    : File:             C:\Program Files\OpenSSH\ssh.exe
                     InternalName:
                     OriginalFilename:
                     FileVersion:      9.5.0.0
                     FileDescription:
                     Product:          OpenSSH for Windows
                     ProductVersion:   OpenSSH_9.5p1 for Windows
                     Debug:            False
                     Patched:          False
                     PreRelease:       False
                     PrivateBuild:     False
                     SpecialBuild:     False
                     Language:         英語 (米国)

Path               : C:\Program Files\OpenSSH\ssh.exe
Extension          : .exe
Definition         : C:\Program Files\OpenSSH\ssh.exe
Source             : C:\Program Files\OpenSSH\ssh.exe
Version            : 9.5.0.0
Visibility         : Public
OutputType         : {System.String}
Name               : ssh.exe
CommandType        : Application
ModuleName         :
Module             :
RemotingCapability : PowerShell
Parameters         :
ParameterSets      :
>#
```

### 3. コマンドを実行
最後に、コマンドが正常に実行できるかためしてみます。

```ssh
# ssh コマンド
ssh -V
ssh -vvv username@hostname

# sftp コマンド
sftp -vvv username@hostname
```
特にエラーが発生しなければ導入完了です。

## GitHub版 OpenSSH のアンインストール
やっぱり使わないなってなったら、`msiexec /x "path to openssh.msi"` でアンインストール可能です。
```powershell:実行例
msiexec /x OpenSSH-Win64-v9.5.0.0.msi
```

## さいごに
Windows で OpenSSH が簡単に使えていいですね。GitHub 版のほうが最新の脆弱性対応がされているので、そちらを使ったほうがいいかなと思います。

## 参考 URL
Home · PowerShell/Win32-OpenSSH Wiki
https://github.com/PowerShell/Win32-OpenSSH/wiki