🐧

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