VS CodeのRemote SSHでWSL, Windows両方の設定を使う
この記事では、VS CodeのRemote SSH拡張機能を使って、WSLとWindowsの両方の設定でSSHターゲットに接続する方法を紹介します。
Remote SSH拡張機能
VS CodeのRemote SSH拡張機能は、VS CodeからSSH接続先のファイルを編集するための拡張機能です。
詳細と使い方はVS Codeのドキュメントで解説されています。
接続先はSSHのconfigファイルから読み込まれます。
また、使用するSSHクライアント、設定ファイルのパスはVS Codeの設定で指定できます。
"remote.SSH.path": "path/to/ssh/binary",
"remote.SSH.configFile": "path/to/ssh/config",
デフォルトではWindowsのOpenSSHクライアントとホームディレクトリの.ssh/config
ファイルが使われます。
課題
私はWSLをメインに使っているため、WSLのSSHクライアントと設定ファイルの内容を使って接続したいです。
また、WSLの他にVagrantなどの仮想環境を使っているので、仮想マシン内にWindowsのSSHクライアントと設定ファイルを使って接続をしたいこともあります。
つまり、VS CodeのRemote SSH拡張機能で、WSLとWindows両方のクライアント、設定を使い分けたいということです。
しかし、WSL側のconfigファイル、SSHクライアントを使った接続はできません。
この問題はGitHubのissueにもなっていて、リリース初期から未解決のままです。
例えば、以下のように無理矢理WSLのSSHクライアントを使うように設定してもうまくいかないことが報告されています。
"remote.SSH.path": "\\wsl$\Ubuntu-18.04\usr\bin\ssh"
"remote.SSH.configFile": "\\wsl$\Ubuntu-18.04\home\user\.ssh\config"
解決策としてWindowsのbatファイルを使ってWSLのSSHクライアントを呼び出す方法が紹介されています。
ただし、この方法ではWindows側のSSHクライアントの使用を完全にオミットすることになります。
つまり、Windows側のクライアントとconfigファイルは使えなくなるということです。
解決
この問題を解決するために、SSHの接続先によって使用するSSHクライアントと設定ファイルを自動的に切り替えるコマンドを作りました。
wsl-ssh-amb
という名前でGitHubに公開しています。
WSL側SSHクライアント実行の代行者(ambassador)という意味でwsl-ssh-amb
という名前にしました。
コマンドの使い方
リリースページからビルド済みのバイナリをダウンロードして、任意の場所に保存します。
次にVS CodeのRemote SSH拡張機能の設定で、SSHクライアントのパスをwsl-ssh-amb
に設定します。
"remote.SSH.path": "path/to/wsl-ssh-amb",
"remote.SSH.remoteServerListenOnSocket": true, // おまじない
接続先一覧に表示させるため、SSHのconfigファイルに接続先を設定します。
一覧に表示されるのは、Windows側の設定ファイル(デフォルトで~/.ssh/config
)の内容です。
WSL側のクライアント、設定を使うために、wsl_
で始まり、WSL側での接続先名が続くような名前をWindows側の設定ファイルに追加します。
例えば、WSL側の設定ファイルが以下のようになっている場合を考えます。
Host server_ubuntu
HostName ubuntu.example.com
Port 2222
User user
IdentityFile ~/.ssh/id_rsa
Host server_centos
HostName centos.example.com
IdentityFile ~/.ssh/id_rsa_centos
ここで、server_ubuntu
にRemote SSHで接続したい場合、Windows側の設定ファイルに以下の項目を追加します。
設定名以外の項目を指定する必要はありません。
Host wsl_server_ubuntu
これにより、Remote SSHの接続先一覧にwsl_server_ubuntu
が表示されるようになります。
この設定を選択すると、wsl-ssh-amb
が実行され、WSL側のSSHクライアントと設定ファイルを使ってserver_ubuntu
に接続がされます。
私の環境では以下のような表示になり、適切にWSL側のクライアント、設定が使われています。
原理説明
そもそも、VS CodeのRemote SSH拡張機能は、SSHのコマンドを直接実行しています。
デバッグの結果、それぞれのOSに特殊な引数は渡していないことがわかりました。
そのため、コマンド内では双方に同じ引数を渡しています。
コマンド内部では、渡された引数をパースしてターゲットの設定を探し、ターゲット名がwsl_
で始まる場合はWSL側、そうでない場合はWindows側のSSHコマンドを実行しています。
まとめ
VS CodeのRemote SSH拡張機能を使って、WSLとWindows両方での接続を共存させる方法を紹介しました。
実はちょっと前に書いたコマンドなんですが、記事にするのを忘れていました。
処理内容は簡単で短いので、PowerShellなどで実装したほうが便利かもしれません。
また、SSH-Agentの対応を確認できていないので、そこもチェックしたいです。
名古屋のAI企業「来栖川電算」の公式publicationです。AI・ML を用いた認識技術・制御技術の研究開発を主軸に事業を展開しています。 公式HP→ kurusugawa.jp/ , 採用情報→ kurusugawa.jp/jobs/
Discussion