Windows で VS Code Remote SSH を使う時のエラー対応

Windows 10 で VS Code の Remote SSH でリモートマシンへの接続が失敗すると Could not establish connection to "xx". というエラーダイアログが出ます。

f:id:kondoumh:20200805092020p:plain

エラーの要因はいろいろありますが、VS Code の出力に

[09:22:02.936] > Bad owner or permissions on C:\\Users\\kondoh/.ssh/config
> 
[09:22:02.946] > プロセスが、存在しないパイプに書き込もうとしました。

のように Bad owner or permissions on .../.ssh/config というメッセージが出る場合は config ファイルのパーミッションが問題があります。Remote SSH の Config File はデフォルトで %USERPROFILE%\.ssh\config になっていて、同ファイルのパーミッションが 400 になっていない場合にこのエラーになるようです。.ssh はプライベートキーが格納されるディレクトリなので config ファイルのパスを変更する方法で回避してみました*1

VS Code が提示してくる設定ファイル Remote-SSH:Open Configuration File.. の選択肢には、C:\ProgramData\ssh\ssh_config があります。

f:id:kondoumh:20200805090825p:plain

C:\ProgramData\ssh\ssh_config を選択するとパーミッションエラーでファイルが作成できません。C:\ProgramData 配下にファイルを作るのは管理者権限が必要です。

そこで C:\Users\<user>\.ssh\config で設定した内容を C:\ProgramData\ssh\ssh_config にコピーします*2。その後 C:\Users\<user>\.ssh\config は削除します*3

これで、無事に VS Code Remote SSH でリモートのプロジェクトを開いて作業できるようになりました。

別の方法として、Remote-SSH:Open Configuration File..Settings specify a custom configuration file で Config File のパスを設定する方法もあります。ユーザプロファイル配下に Config File を作れば、UAC の許可は不要です。

f:id:kondoumh:20200805090003p:plain

この他、

  • 踏み台サーバ経由で接続する場合 ProxyCommand にフルパスを指定する必要がある
  • SSL 証明書 (pem ファイル) を使用する場合、これもユーザプロファイル配下に配置しないと Permissions for 'xxx' are too open. のようなエラーになる

など、色々とハマりポイントがあります。

*1:Git for Windows を使ってるとパーミッションを変更するのがちょっと面倒そうなので。

*2:コピー時に Windows の UAC のダイアログが出るので OK する必要があります

*3:C:\Users\.ssh\config の優先度が高いらしく削除しないと冒頭のエラーが出ます。