それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

windowsのsshのシェルをcmd.exeから ps/wsl bashへ切り替える。

windowsのOpenSSH機能をカスタマイズする。

WindowsのOpenSSHサーバーでログインすると、cmd.exeが起動するが、それをWSL bashや ps / powershell に切り替える。

レジストリの HKLM:\SOFTWARE\OpenSSH を見る

Computer\HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSHDefaultShell を作ってコマンドパスを入れれば、デフォルトシェルを変更することができる。 f:id:takuya_1st:20220304170201p:plain

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