windowsのOpenSSH機能をカスタマイズする。
WindowsのOpenSSHサーバーでログインすると、cmd.exeが起動するが、それをWSL bashや ps / powershell に切り替える。
レジストリの HKLM:\SOFTWARE\OpenSSH を見る
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH
に DefaultShell
を作ってコマンドパスを入れれば、デフォルトシェルを変更することができる。
cmd.exe → ps にする
PS C:\Windows\system32> New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force DefaultShell : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE PSChildName : OpenSSH PSDrive : HKLM PSProvider : Microsoft.PowerShell.Core\Registry
cmd.exe → wsl.exe にする⇐ おすすめしない
PS C:\Windows\system32> New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\system32\wsl.exe" -PropertyType String -Force DefaultShell : C:\Windows\system32\wsl.exe PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE PSChildName : OpenSSH PSDrive : HKLM PSProvider : Microsoft.PowerShell.Core\Registry
cmd.exe → bash ( wsl bash ) にする。⇐ おすすめ!
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\system32\bash.exe" -PropertyType String -Force
cmd.exe → gnu bash ( git bash ) にする
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Program Files\Git\usr\bin\bash.exe" -PropertyType String -Force
cmd.exe に戻す
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\system32\cmd.exe" -PropertyType String -Force
パスの確認方法
Get-Command wsl whereis ps
など
シェルに使えそうなもの
tty でリッスンできるものであれば、割と何でも使える。
C:\Program Files\Git\usr\bin\bash.exe # msys/git-bash C:\Windows\System32\bash.exe # wsl bash C:\Windows\System32\wsl.exe # wsl C:\Windows\System32\powershell.exe # ps C:\Windows\System32\cmd.exe # ps
wsl.exe はそのままだと、bashを起動するだけのエイリアスであり、引数なしで使うのは不便で、標準入力が取れないのでおすすめしない。
WSL.exeを使った場合、次ができない。
echo hello | ssh win10 cat - | cat -
ただ、代わりにbash.exe を使えばできる。なのでWSL.exeはおすすめしない
その他の手段
request tty して remotecommand で wsl などを起動する。
ssh win10 -t wsl
デフォルト設定を活かすなら request tty でもいいと思うが、request tty する場合、リモートコマンドを使うので、STDINを渡すのが面倒くさい。デフォルトシェルをbashに切り替えたほうが便利だった。
レジストリが触れない時
レジストリが変えられないときは、RequestTTY を使う。 WindowsのWSLへ直接SSHする。 - それマグで!
VS Code などcmd.exeが前提に初期設定されてるものは動作がおかしくなると思います。レジストリよりTTYでやるべきです。
参考資料
https://jeremyverda.net/change-openssh-server-default-shell-on-windows-server-2019/
https://www.server-world.info/query?os=Windows_Server_2019&p=ssh&f=5