🐧
WindowsPCにSSH接続したら自動的にWSLのUbuntuに繋げる
はじめに
Windows OpenSSH で 「SSH ⇒ そのまま WSL Ubuntu 24.04」 を実現しようとすると、素直に
HKLM\SOFTWARE\OpenSSH\DefaultShell = C:\Windows\System32\wsl.exe -d Ubuntu-24.04 -e bash -l
と書きたくなるが DefaultShell には “実行ファイルのフルパス” しか入らず、引数を書けない。
他にも以下の問題が
- Windows SSHD は内部 UTF-8 だが、親コンソールが Shift-JIS (CP932) のままだと日本語が化ける。
- Microsoft Store 版 WSL は サービスセッション (Session 0) から呼ばれると Access is denied で即死 する既知バグ。(2025年5月現在)
そこですべての面倒を肩代わりする小さなラッパー wsl-shell.cmd を作り、レジストリにはそのパスだけを渡すことで解決。
- PowerShellは管理者権限で実行
- C:\wsl-shell.cmd は UTF-8 (BOM なし) で作成
- SSH 接続先名(例の “winbox”)は好きなホスト名または IP に読み替え
[A] WSL と Ubuntu 24.04 の導入
wsl --install --distribution Ubuntu-24.04 # まだ入れていない場合
wsl --set-default-version 2 # 念のため WSL2 を既定に
[B] OpenSSH サーバーをセットアップ
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Set-Service sshd -StartupType Automatic
Start-Service sshd
New-NetFirewallRule -Name "SSHD-In" -Protocol TCP -DestinationPort 22 `
-Action Allow -DisplayName "OpenSSH Server (Inbound)"
[C] WSL 起動用ラッパー C:\wsl-shell.cmd を UTF-8(BOM 無)で作成
@echo off
chcp 65001 > nul
C:\Windows\System32\wsl.exe -d Ubuntu-24.04 -e bash -l %*
'@ | Set-Content -Encoding utf8NoBOM -Path C:\wsl-shell.cmd -Force
[D] OpenSSH の既定シェルを wsl-shell.cmd に置換
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" `
-Name "DefaultShell" -Value "C:\wsl-shell.cmd" `
-PropertyType String -Force
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" `
-Name "DefaultShellEscapeArguments" -Value 0 `
-PropertyType DWord -Force
Restart-Service sshd
② WSL Ubuntu 24.04 ターミナル
[E] 日本語ロケール (UTF-8) を入れる
sudo apt update
sudo apt install -y language-pack-ja-base language-pack-ja
sudo update-locale LANG=ja_JP.UTF-8
③ 動作確認 (クライアント側シェル)
※ <windows-user> と <HOST/IP> を自分の環境に置換
ssh <windows-user>@<HOST/IP>
ssh <windows-user>@<HOST/IP> 'uname -a'
Discussion