echo("備忘録");

IT技術やプログラミング関連など、技術系の事を備忘録的にまとめています。

【VS Code】Remote SSHをWindows+WSL2で動かしてて困ったこと

はじめに

前回の記事でも書きましたが、先日、VS Code Conference 2022-2023で登壇しました。
運営の皆さん&聞いてくださった皆さん、ありがとうございました。

その時のスライドが以下なのですが、このスライドの17枚目で「Windows+WSL環境でRemote SSHを動かす場合、少しやっかいな部分がある」と記載しています。(17枚目に直リンできない...)

speakerdeck.com

今回は、その「やっかいな部分」について記載します。

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 SSHssh接続時にコマンドプロンプト(cmd.exe)を使用して接続します。(wslでもbashでもない)

これの何が厄介かというと、コマンドプロンプトWindowsからWSLフォルダを参照する際の \\wsl$\(ディストリビューション名)\home\(ユーザー名) という形式でのパスが使用できないんです。(「CMD では UNC パスは現在のディレクトリとしてサポートされません。」とエラーになる。なおPowerShellは使用可能)

なので、WSL側のフォルダを参照することが、どうしてもできなかったです。

ちなみにこれ、Windowsのデフォルトシェルを変えたら、ちゃんと変わるんですかね?
試せてない(やり方を知らない)ので、ちょっと不明です。

なお、以下の方法では使用するターミナルを変更できませんでした。

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 SSHWindows+WSL2で動かしてて困ったことについて書きました。

が、結論から言うと「Windows+WSL環境でも、秘密鍵Windows側のフォルダを参照する」ということさえ割り切ってしまえば、全く支障はないと思います。

なお「WSLで作成した秘密鍵Windows側にコピーしたら、パーミッションが緩くなってAccess Denied(public key)になる&chmodでもパーミッションが変えられない!」という場合は、私が前々回に書いた 【WSL2】Windowsのファイル・フォルダをchmodする

それでは、今回はこの辺で。