Visual Studio Codeを使ってて、Remote DevelopmentとかRemote – SSHとか急に繋がらなくなった皆様へ。

Mac使ってるとなんかの拍子にCommand + Qとか押しちゃってアプリ閉じちゃう時あるじゃないですか。

今日Azure VM上でRemote Developmentやっててそれをやらかして「ああ、やっちまった」って繋げ直そうとしたらSSHが繋がらんわけですよ。

動転してたのでエラーログを取るのを忘れたのが痛恨ですが、SSHがどうだのResolvingがどうだの言ってSSHのパスフレーズダイアログが一瞬でて「Connection Lost」とか「パスフレーズダイアログを閉じたぜ(英語)」とか言ってどうしても繋がってくれんわけです。

※後で再現できるようになりましたので、後ろの方にエラーログ置いときます。

とりあえず落ち着いて、Terminalからsshログインするとちゃんとログインできるんですよね。

「サーバ再起動すりゃ治るだろ」

直りませんでした。顔が青ざめてきました。

「VS Code(Insider」入れ直せば治るだろ」
と、アプリをゴミ箱に入れて、Library内のCode – Insiderの中身とか全部消して再起動してアプリ入れ直しても直りませんでした。

さらに顔が青ざめてきました。

サーバがあかんのだろうとサーバのユーザフォルダにある
.vscode-server-insiders
とかを消してサーバ再起動もしてみました。

直りませんでした。


直し方

結局治ったんですが、VS CodeのRemote.SSH: Use Local Serverのチェックを外すことで直りました。

いやー、明日までにこさえにゃいかんもんがあったので焦りましたよね。

https://github.com/microsoft/vscode-remote-release/issues/2513

この辺りをご参考に願います英語ですが。

VS Codeの設定画面だと以下のところですね。

このエラーが出る人、多分ここ、チェック入ってると思います。

外したら直りました。

これを外すと、再接続するときに「繋げ先のOSは何だ」を聞かれるようになりますが、一回答えればもう出て来なくなるので大した問題ではありません。「サーバに繋がらない」より大した問題なんてありません。

よかった。

このチェックを「ON」にすると確実にエラーが発生するようになりました。

なぜ今まではONのままで動いてたのか、、、謎だげ。気づかないうちにVS Codeのアップデートが走りましたかねえ。

たぶんこれ、VS CodeのInsider版かそうじゃないか、みたいな問題じゃないと思われますねえ。

single connection shared between windows and across window reloads.
ってことなので、コネクションの使い回しをするモードになるみたいですね。これがONだと。
その使い回そうとしてるコネクションのOSがなんらかの拍子に切り替わっちゃったもんでこのエラーが起きて、VSCode再インストールしてもサーバ再起動してもそもそもこっちが違っとるからアカンカッタ、とかそういうことですかねえ。ようわからん。

と、いうことで、再現できるようになりましたのでエラーログ置いときますね。
ホスト名は知られると恥ずかしいので、[HOSTNAME]の文字で置き換えてあります。ユーザー名がtakashiって思いっ切り出とるやん。まあ名前隠しているわけじゃないからいいや。
他のハッシュ値みたいなのは、、、見られてもいいのかな。知らん。

[21:46:54.639] Log Level: 2
[21:46:54.640] remote-ssh@0.65.3
[21:46:54.640] darwin arm64
[21:46:54.640] SSH Resolver called for "ssh-remote+[HOSTNAME]", attempt 1
[21:46:54.640] "remote.SSH.useLocalServer": true
[21:46:54.641] "remote.SSH.path": undefined
[21:46:54.641] "remote.SSH.sshConfigurationFile": undefined
[21:46:54.641] "remote.SSH.useFlock": true
[21:46:54.641] "remote.SSH.lockfilesInTmp": false
[21:46:54.641] "remote.SSH.localServerDownload": auto
[21:46:54.641] "remote.SSH.remoteServerListenOnSocket": false
[21:46:54.641] "remote.SSH.showLoginTerminal": false
[21:46:54.641] "remote.SSH.defaultExtensions": []
[21:46:54.641] "remote.SSH.loglevel": 2
[21:46:54.641] SSH Resolver called for host: [HOSTNAME]
[21:46:54.641] Setting up SSH remote "[HOSTNAME]"
[21:46:54.643] Acquiring local install lock: /var/folders/1_/67qzl16x29581_9l61bdctym0000gn/T/vscode-remote-ssh-[HOSTNAME]-install.lock
[21:46:54.646] Looking for existing server data file at /Users/takashi/Library/Application Support/Code - Insiders/User/globalStorage/ms-vscode-remote.remote-ssh/vscode-ssh-host-[HOSTNAME]-8aff878db2542eea2dfb571c8bb485118bbb3113-0.65.3/data.json
[21:46:54.646] Using commit id "8aff878db2542eea2dfb571c8bb485118bbb3113" and quality "insider" for server
[21:46:54.648] Install and start server if needed
[21:46:54.649] PATH: /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin
[21:46:54.649] Checking ssh with "ssh -V"
[21:46:54.652] > OpenSSH_8.1p1, LibreSSL 2.7.3

[21:46:54.653] askpass server listening on /var/folders/1_/67qzl16x29581_9l61bdctym0000gn/T/vscode-ssh-askpass-8e37b295692d968a97e7da4377311079863a6c95.sock
[21:46:54.654] Spawning local server with {"ipcHandlePath":"/var/folders/1_/67qzl16x29581_9l61bdctym0000gn/T/vscode-ssh-askpass-058c7055cd13db9e85bc2d4ee1b11c9c98421150.sock","sshCommand":"ssh","sshArgs":["-v","-T","-D","52284","-o","ConnectTimeout=15","[HOSTNAME]"],"dataFilePath":"/Users/takashi/Library/Application Support/Code - Insiders/User/globalStorage/ms-vscode-remote.remote-ssh/vscode-ssh-host-[HOSTNAME]-8aff878db2542eea2dfb571c8bb485118bbb3113-0.65.3/data.json"}
[21:46:54.654] Local server env: {"DISPLAY":"1","ELECTRON_RUN_AS_NODE":"1","SSH_ASKPASS":"/Users/takashi/.vscode-insiders/extensions/ms-vscode-remote.remote-ssh-0.65.3/out/local-server/askpass.sh","VSCODE_SSH_ASKPASS_NODE":"/Applications/Visual Studio Code - Insiders.app/Contents/Frameworks/Code - Insiders Helper (Renderer).app/Contents/MacOS/Code - Insiders Helper (Renderer)","VSCODE_SSH_ASKPASS_MAIN":"/Users/takashi/.vscode-insiders/extensions/ms-vscode-remote.remote-ssh-0.65.3/out/askpass-main.js","VSCODE_SSH_ASKPASS_HANDLE":"/var/folders/1_/67qzl16x29581_9l61bdctym0000gn/T/vscode-ssh-askpass-8e37b295692d968a97e7da4377311079863a6c95.sock"}
[21:46:54.654] Spawned 2568
[21:46:54.708] > local-server> Spawned ssh: 2570
[21:46:54.710] stderr> OpenSSH_8.1p1, LibreSSL 2.7.3
[21:46:54.823] stderr> debug1: Server host key: ecdsa-sha2-nistp256 SHA256:ttGZnEYHIuWBBQLv/EgBeJF9BHcCQKC1R5RUBuua7Ls
[21:46:54.956] Got askpass request: {"request":"Enter passphrase for key '/Users/takashi/.ssh/id_rsa':"}
[21:46:54.956] Detected passphrase message
[21:46:54.956] Listening for interwindow password on /var/folders/1_/67qzl16x29581_9l61bdctym0000gn/T/vscode-ssh-askpass-bdb7fb765d162a00e1a51a2282ff4d9f55c62bb1.sock
[21:46:54.956] Writing password prompt to globalState
[21:46:55.171] stderr> events.js:292
[21:46:55.171] stderr>       throw er; // Unhandled 'error' event
[21:46:55.171] stderr>       ^
[21:46:55.171] stderr> 
[21:46:55.171] stderr> Error [ERR_STREAM_WRITE_AFTER_END]: write after end
[21:46:55.171] stderr>     at writeAfterEnd (_http_outgoing.js:668:15)
[21:46:55.171] stderr>     at ServerResponse.end (_http_outgoing.js:789:7)
[21:46:55.171] stderr>     at Object.onRequest (/Users/takashi/.vscode-insiders/extensions/ms-vscode-remote.remote-ssh-0.65.3/out/localServer.js:1:2599)
[21:46:55.171] stderr>     at Server.<anonymous> (/Users/takashi/.vscode-insiders/extensions/ms-vscode-remote.remote-ssh-0.65.3/out/localServer.js:1:1914)
[21:46:55.171] stderr>     at Server.emit (events.js:315:20)
[21:46:55.171] stderr>     at parserOnIncoming (_http_server.js:874:12)
[21:46:55.171] stderr>     at HTTPParser.parserOnHeadersComplete (_http_common.js:126:17)
[21:46:55.171] stderr> Emitted 'error' event on ServerResponse instance at:
[21:46:55.171] stderr>     at writeAfterEndNT (_http_outgoing.js:727:7)
[21:46:55.172] stderr>     at processTicksAndRejections (internal/process/task_queues.js:81:21) {
[21:46:55.172] stderr>   code: 'ERR_STREAM_WRITE_AFTER_END'
[21:46:55.172] stderr> }
[21:46:55.173] Local server exit: 1
[21:46:55.174] Received install output: OpenSSH_8.1p1, LibreSSL 2.7.3
debug1: Server host key: ecdsa-sha2-nistp256 SHA256:ttGZnEYHIuWBBQLv/EgBeJF9BHcCQKC1R5RUBuua7Ls
events.js:292
      throw er; // Unhandled 'error' event
      ^

Error [ERR_STREAM_WRITE_AFTER_END]: write after end
    at writeAfterEnd (_http_outgoing.js:668:15)
    at ServerResponse.end (_http_outgoing.js:789:7)
    at Object.onRequest (/Users/takashi/.vscode-insiders/extensions/ms-vscode-remote.remote-ssh-0.65.3/out/localServer.js:1:2599)
    at Server.<anonymous> (/Users/takashi/.vscode-insiders/extensions/ms-vscode-remote.remote-ssh-0.65.3/out/localServer.js:1:1914)
    at Server.emit (events.js:315:20)
    at parserOnIncoming (_http_server.js:874:12)
    at HTTPParser.parserOnHeadersComplete (_http_common.js:126:17)
Emitted 'error' event on ServerResponse instance at:
    at writeAfterEndNT (_http_outgoing.js:727:7)
    at processTicksAndRejections (internal/process/task_queues.js:81:21) {
  code: 'ERR_STREAM_WRITE_AFTER_END'
}

[21:46:55.174] Failed to parse remote port from server output
[21:46:55.183] Resolver error: Error: 
	at Function.Create (/Users/takashi/.vscode-insiders/extensions/ms-vscode-remote.remote-ssh-0.65.3/out/extension.js:1:64641)
	at Object.t.handleInstallOutput (/Users/takashi/.vscode-insiders/extensions/ms-vscode-remote.remote-ssh-0.65.3/out/extension.js:1:63284)
	at Object.e [as tryInstallWithLocalServer] (/Users/takashi/.vscode-insiders/extensions/ms-vscode-remote.remote-ssh-0.65.3/out/extension.js:1:386419)
	at processTicksAndRejections (internal/process/task_queues.js:93:5)
	at async /Users/takashi/.vscode-insiders/extensions/ms-vscode-remote.remote-ssh-0.65.3/out/extension.js:1:294035
	at async Object.t.withShowDetailsEvent (/Users/takashi/.vscode-insiders/extensions/ms-vscode-remote.remote-ssh-0.65.3/out/extension.js:1:405329)
	at async /Users/takashi/.vscode-insiders/extensions/ms-vscode-remote.remote-ssh-0.65.3/out/extension.js:1:384890
	at async E (/Users/takashi/.vscode-insiders/extensions/ms-vscode-remote.remote-ssh-0.65.3/out/extension.js:1:381658)
	at async Object.t.resolveWithLocalServer (/Users/takashi/.vscode-insiders/extensions/ms-vscode-remote.remote-ssh-0.65.3/out/extension.js:1:384517)
	at async Object.t.resolve (/Users/takashi/.vscode-insiders/extensions/ms-vscode-remote.remote-ssh-0.65.3/out/extension.js:1:295505)
	at async /Users/takashi/.vscode-insiders/extensions/ms-vscode-remote.remote-ssh-0.65.3/out/extension.js:127:110540
[21:46:55.186] ------




[21:46:58.157] Passphrase dialog canceled
[21:46:58.157] Interactor signaled cancel
[21:46:58.158] Cleaning up other-window auth server

https://teratail.com/questions/281897

この辺りもご参考に。

Bash 以外のシェルを使用しているとこの問題が発生するらしく、

設定で remote.SSH.useLocalServer を false にすると改善するらしいです

とのことです。Macはbashからzshに変わりましたね。それでも多分上記のチェックは入ったまま今日までは使えてたので、なんの拍子にこんなことになってしまったのかよくわかりませんが、気にしないことにしました。

同症状で困っている人はこれで治るといいですね。


[追記]

VS Codeのsettings.jsonはdotfile的な感じでgit管理しているので、diffを取ってみたらこんな感じになってました。

例によってHOSTNAMEは伏せてありますが、こんなふうに、繋げ先のOSを覚えてくれるようになってくれたようです。これが食い違ってたから繋がらなかった、、、ってことですかね。わからんけど。

Codeの設定画面上だとこれですね。

こんなとこの設定いつも見ないのでねえ。前からありましたかねえ。わかんない。

気持ち悪いけどあんまり気にしないことにします。