はじめに
前回の記事でも書きましたが、先日、VS Code Conference 2022-2023で登壇しました。
運営の皆さん&聞いてくださった皆さん、ありがとうございました。
その時のスライドが以下なのですが、このスライドの17枚目で「Windows+WSL環境でRemote SSHを動かす場合、少しやっかいな部分がある」と記載しています。(17枚目に直リンできない...)
今回は、その「やっかいな部分」について記載します。
WSLでも、Windowsフォルダを参照する
VS CodeでWSLに接続していても、Remote SSHで鍵認証で接続する際、鍵ファイルはWindowsのフォルダを参照します。
例えば鍵ファイルのパスを ~/.ssh.id_rsa
のように指定すると、接続する際にはC:\Users\(ユーザー名)\.ssh\id.rsa
と、Windowsのホームフォルダを参照します。
また/home/(ユーザー名)/.ssh.id_rsa
のように絶対パスで指定すると、接続時に「そんなファイ存在しない」とエラーになってしまいます。(Windowsで/home/(ユーザー名)/.ssh.id_rsa
みたいなパス指定は無効から)
なので、Windows+WSLの場合、例えWSLに接続していても秘密鍵はWindows側フォルダに置き、Windows形式のパス指定する必要があります。
※私がやり方を知らないだけ?てか、私が変にこだわっていただけで、そもそもそういうものなのかも...
WSLでも、ssh接続にコマンドプロンプトを使用する
もう一つ厄介だなあと思った部分がこれで、Windows+WSLの場合でも、Remote SSHはssh接続時にコマンドプロンプト(cmd.exe)を使用して接続します。(wslでもbashでもない)
これの何が厄介かというと、コマンドプロンプトはWindowsからWSLフォルダを参照する際の \\wsl$\(ディストリビューション名)\home\(ユーザー名)
という形式でのパスが使用できないんです。(「CMD では UNC パスは現在のディレクトリとしてサポートされません。」とエラーになる。なおPowerShellは使用可能)
なので、WSL側のフォルダを参照することが、どうしてもできなかったです。
ちなみにこれ、Windowsのデフォルトシェルを変えたら、ちゃんと変わるんですかね?
試せてない(やり方を知らない)ので、ちょっと不明です。
なお、以下の方法では使用するターミナルを変更できませんでした。
- VS Codeのターミナルの設定で、使用するターミナルを変更する
- WindowsのOpenSSHのデフォルトシェルを変更する
- 参考: windowsのsshのシェルをcmd.exeから ps/wsl bashへ切り替える。 - それマグで!
- レジストリを変更することになるので、実施する場合は自己責任で!
Remote SSHにも、それっぽい設定はあるけども
実はRemote SSHにも「Remote SSH:Path」という「SSH実行可能ファイルへの絶対パス」を指定する設定があり、ここにターミナルの実行ファイル(*.exe)のパスを記載すればいけるのでは?と思っていたんですが...
実際には、これはsshコマンドを行うための実行ファイルの設定でした。( ssh -V
の「ssh」の代わりのコマンド。もちろんデフォルトはssh)
そりゃあ、PowerShellなりwslなりを指定してもダメですよね。(※1, ※2)
ただ、やはり「WSLなのにwsl.exeで動かない」というのはみんな使いにくいようで、実際その旨のissueも上がっています。
Remote-SSH: Fails to discover WSL SSH · Issue #937 · microsoft/vscode-remote-release · GitHub
またこのissue内で「*.batファイルでうまいこと書けばチェック通るよ」というコメントを残している人もいて「頭のいい人はいるんだなあ」と改めて実感しました。(結果的には、この方法だと最後の実際にssh接続するところでエラーになって、接続出来ないのですが...)
https://github.com/microsoft/vscode-remote-release/issues/937#issuecomment-514714615
※1)
Remote SSHでは、ssh接続前に「Remote SSH:Pathの実行ファイルを使用して実行ファイル -V
というコマンドを実行し、その実行結果に「OpenSSH」という文字が含まれているか」というチェックを実施しています。
なのでRemote SSH:Pathにsshに対応していない実行ファイルを指定すると、このチェックでエラーになります。
※2)
ssh -V
コマンドを実行した場合、例えば以下のような文字列が表示されますので、この文字列の「OpenSSH」の存在をチェックしています。
OpenSSH_for_Windows_8.1p1, LibreSSL 3.0.2
まとめ
以上、Remote SSHをWindows+WSL2で動かしてて困ったことについて書きました。
が、結論から言うと「Windows+WSL環境でも、秘密鍵はWindows側のフォルダを参照する」ということさえ割り切ってしまえば、全く支障はないと思います。
なお「WSLで作成した秘密鍵をWindows側にコピーしたら、パーミッションが緩くなってAccess Denied(public key)になる&chmodでもパーミッションが変えられない!」という場合は、私が前々回に書いた 【WSL2】Windowsのファイル・フォルダをchmodする
それでは、今回はこの辺で。