[VSCode / Remote-SSH] ターミナルからはSSH接続できるのに、VSCodeからのSSH接続で弾かれるときの対処

# 1. 症状

数分前まで、VSCodeから何の問題もなくリモートサーバーへのアクセスができていた。
しかし、なぜか急にVSCodeからのSSH接続ができなくなった。

そこで、SSH接続の試行中や失敗後に、VSCodeの`出力 (output) タブ`を確認したところ、以下のようなエラーを確認できた。

## エラーの抜粋

```bash
[19:05:24.142] stderr> OpenSSH_9.0p1, LibreSSL 3.3.6
[19:05:24.673] stderr> debug1: Server host key: ssh-ed25519 SHA256:qhW0XwqcYGXLSUw5bYEv3mitD1lgz5s0sQ+sqmzZQ9E
[19:05:24.852] stderr> Authenticated to 10.2.1.227 (via proxy) using "publickey".
[19:05:24.853] stderr> bind [::1]:'<port_number>': Address already in use
[19:05:24.853] stderr> bind [127.0.0.1]:'<port_number>': Address already in use
[19:05:24.853] stderr> channel_setup_fwd_listener_tcpip: cannot listen to port: '<port_number>'
```

手がかりはこれだけ。

## 環境

|項目||
|:-----------|:--|
|ローカルPC    |MacOS (M2)|
|リモートサーバー|AWS EC2|
|リモートOS    |Ubuntu|
|VSCode version|バージョン: 1.78.2 (Universal)|

念のため私の環境を記載したものの、
おそらくMac以外（windowsなど）でも発生すると思われる。



# 2. 対処法

とりあえず先に結論だけ書きます！
以下の対処法で処理できました。


> ・ssh to the remote machine(s) and delete the ~/.vscode-server directory with rm -Rf ~/.vscode-server/
> 
> https://learn.microsoft.com/en-us/answers/questions/939587/fail-to-ssh-connect-to-ubuntu-vm-using-visual-stud

具体的な手順は以下の通り。


## 2-1. SSHアクセス時のHost名を確認

`Host名`は、PC上の`config`というファイルに書かれています。
これを確認します。

VSCodeからSSHアクセスできていたということは、貴方のPCにはおそらく、 `~/.ssh/config` というファイルがあるはずです。
（ただし、もしかしたら`config`ファイルが、他のフォルダ内にあるかもしれません。）

そのファイルに書かれているHost名が必要です。

:::note
**configファイルの見方**
例えば以下のような設定になっているのであれば、、、
```bash:~/.ssh/config
Host training_server # <------ この場合は、 training_server がHost名
    HostName 10.2.3.4
    User ubuntu
    IdentityFile /Users/<username>/.ssh/id_private_key
```
:::

VSCodeからも確認できます。

:::note
**VSCodeでHost名を確認する場合**
![スクリーンショット 2023-06-12 19.48.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/579b5ad6-8d16-7462-b4da-76e166c101dd.png)
※VSCodeのここ👆に表示されているのがHost名ですよ。
:::

## 2-2. ターミナルからSSHアクセス

次に、VSCodeは使わず、PCのターミナルから直接SSHアクセスします。
`ssh`の後ろには、先ほど調べた `Host名` を入力してください。

```bash:PCのターミナル
# 以下のようにsshアクセスします
$ ssh training_server
```

ターミナルからのSSHアクセスに成功した場合、プロンプトの表記が変わるはずです。

逆に、**このSSHアクセスが失敗する場合は、問題の原因が本記事とは異なります**ので、他の原因を調査した方が良いでしょう。


## 2-3. ~/.vscode-server/ の削除

アクセス先のリモートサーバー内では、`~/.vscode-server/`を削除します。

```bash:bash
$ rm -Rf ~/.vscode-server/
```

これで、元通りVSCodeからリモートサーバーへとSSHアクセスできるようになっているはずです！


# 3. 調査経過

参考までに、上記の結論にいたるまでに調べた情報も書いておきます( \*¯ ꒳¯\*)✨


## 3-1. エラーログ本体

全体ではないものの、ログを以下に載せておきます。
以下の内容が何度もリピートで流れ続けました。


```bash
[19:05:24.037] Log Level: 2
[19:05:24.044] SSH Resolver called for "ssh-remote+'<SSHアクセス先>'", attempt 1
[19:05:24.044] "remote.SSH.useLocalServer": true
[19:05:24.044] "remote.SSH.path": undefined
[19:05:24.044] "remote.SSH.configFile": undefined
[19:05:24.044] "remote.SSH.useFlock": true
[19:05:24.044] "remote.SSH.lockfilesInTmp": false
[19:05:24.044] "remote.SSH.localServerDownload": auto
[19:05:24.044] "remote.SSH.remoteServerListenOnSocket": false
[19:05:24.045] "remote.SSH.showLoginTerminal": false
[19:05:24.045] "remote.SSH.defaultExtensions": []
[19:05:24.045] "remote.SSH.loglevel": 2
[19:05:24.045] "remote.SSH.enableDynamicForwarding": true
[19:05:24.045] "remote.SSH.enableRemoteCommand": false
[19:05:24.045] "remote.SSH.serverPickPortsFromRange": {}
[19:05:24.045] "remote.SSH.serverInstallPath": {}
[19:05:24.049] VS Code version: 1.78.2
[19:05:24.049] Remote-SSH version: remote-ssh@0.102.0
[19:05:24.049] darwin arm64
[19:05:24.049] SSH Resolver called for host: '<SSHアクセス先>'
[19:05:24.049] Setting up SSH remote "'<SSHアクセス先>'"
[19:05:24.051] Acquiring local install lock: /var/folders/7r/d08538nj63ncgxpk9jwhpxsc0000gp/T/vscode-remote-ssh-da1eb267-install.lock
[19:05:24.051] Looking for existing server data file at /Users/'<username>'/Library/Application Support/Code/User/globalStorage/ms-vscode-remote.remote-ssh/vscode-ssh-host-da1eb267-b3e4e68a0bc097f0ae7907b217c1119af9e03435-0.102.0/data.json
[19:05:24.052] Using commit id "b3e4e68a0bc097f0ae7907b217c1119af9e03435" and quality "stable" for server
[19:05:24.053] Install and start server if needed
[19:05:24.055] PATH: /Users/'<username>'/.pyenv/shims:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/usr/local/mysql/bin
[19:05:24.055] Checking ssh with "ssh -V"
[19:05:24.063] > OpenSSH_9.0p1, LibreSSL 3.3.6

[19:05:24.066] askpass server listening on /var/folders/7r/d08538nj63ncgxpk9jwhpxsc0000gp/T/vscode-ssh-askpass-e9630d00534335dfa147c8c9cde013370ec260d6.sock
[19:05:24.066] Spawning local server with {"serverId":1,"ipcHandlePath":"/var/folders/7r/d08538nj63ncgxpk9jwhpxsc0000gp/T/vscode-ssh-askpass-7737e24c0e4bb81d177ef72f307ff3513945fcfa.sock","sshCommand":"ssh","sshArgs":["-v","-T","-D","50384","-o","ConnectTimeout=15","'<SSHアクセス先>'"],"serverDataFolderName":".vscode-server","dataFilePath":"/Users/'<username>'/Library/Application Support/Code/User/globalStorage/ms-vscode-remote.remote-ssh/vscode-ssh-host-da1eb267-b3e4e68a0bc097f0ae7907b217c1119af9e03435-0.102.0/data.json"}
[19:05:24.066] Local server env: {"SSH_AUTH_SOCK":"/private/tmp/com.apple.launchd.u6qA2youBr/Listeners","SHELL":"/bin/zsh","DISPLAY":"1","ELECTRON_RUN_AS_NODE":"1","SSH_ASKPASS":"/Users/'<username>'/.vscode/extensions/ms-vscode-remote.remote-ssh-0.102.0/out/local-server/askpass.sh","VSCODE_SSH_ASKPASS_NODE":"/Users/'<username>'/Downloads/Visual Studio Code.app/Contents/Frameworks/Code Helper (Plugin).app/Contents/MacOS/Code Helper (Plugin)","VSCODE_SSH_ASKPASS_EXTRA_ARGS":"--ms-enable-electron-run-as-node","VSCODE_SSH_ASKPASS_MAIN":"/Users/'<username>'/.vscode/extensions/ms-vscode-remote.remote-ssh-0.102.0/out/askpass-main.js","VSCODE_SSH_ASKPASS_HANDLE":"/var/folders/7r/d08538nj63ncgxpk9jwhpxsc0000gp/T/vscode-ssh-askpass-e9630d00534335dfa147c8c9cde013370ec260d6.sock"}
[19:05:24.067] Spawned 7683
[19:05:24.137] > local-server-1> Running ssh connection command: "-v -T -D 50384 -o ConnectTimeout=15 '<SSHアクセス先>'"
[19:05:24.138] > local-server-1> Spawned ssh, pid=7689
[19:05:24.142] stderr> OpenSSH_9.0p1, LibreSSL 3.3.6
[19:05:24.673] stderr> debug1: Server host key: ssh-ed25519 SHA256:qhW0XwqcYGXLSUw5bYEv3mitD1lgz5s0sQ+sqmzZQ9E
[19:05:24.852] stderr> Authenticated to 10.2.1.227 (via proxy) using "publickey".
[19:05:24.853] stderr> bind [::1]:'<port_number>': Address already in use
[19:05:24.853] stderr> bind [127.0.0.1]:'<port_number>': Address already in use
[19:05:24.853] stderr> channel_setup_fwd_listener_tcpip: cannot listen to port: '<port_number>'
[19:05:25.035] > Welcome to Ubuntu 22.04 LTS (GNU/Linux 5.19.0-1022-aws x86_64)
> 
>  * Documentation:  https://help.ubuntu.com
>  * Management:     https://landscape.canonical.com
>  * Support:        https://ubuntu.com/advantage
> 
>   System information as of Mon Jun 12 10:04:32 UTC 2023
> 
>   System load:  2.2568359375        Processes:                259
>   Usage of /:   80.7% of 968.99GB   Users logged in:          1
>   Memory usage: 43%                 IPv4 address for docker0: 172.17.0.1
>   Swap usage:   0%                  IPv4 address for eth0:    10.2.1.227
> 
>  * Ubuntu Pro delivers the most comprehensive open source security and
>    compliance features.
> 
>    https://ubuntu.com/aws/pro
> 
> 107 updates can be applied immediately.
> To see these additional updates run: apt list --upgradable
> 
> 
> *** System restart required ***
[19:05:25.092] > ready: 930fb5b872f4
[19:05:25.126] > Linux 5.19.0-1022-aws #23~22.04.1-Ubuntu SMP Fri Mar 17 15:38:24 UTC 2023
[19:05:25.127] Platform: linux
[19:05:25.151] > /bin/bash
[19:05:25.151] Shell: bash
[19:05:25.151] Creating bash subshell inside "bash"
[19:05:25.187] > bash version:  5.1.16(1)-release
[19:05:25.235] > 930fb5b872f4: running
[19:05:25.261] > Acquiring lock on /home/ubuntu/.vscode-server/bin/b3e4e68a0bc097f0ae7907b217c1119af9e03435/vscode-remote-lock.ubuntu.b3e4e68a0bc097f0ae7907b217c1119af9e03435
[19:05:25.292] > Installation already in progress...
> If you continue to see this message, you can try toggling the remote.SSH.useFlock setting
> 930fb5b872f4: start
> exitCode==24==
> listeningOn====
> osReleaseId==ubuntu==
> arch==x86_64==
> vscodeArch==x64==
> bitness==64==
> tmpDir==/run/user/1000==
> platform==linux==
> unpackResult====
> didLocalDownload==0==
> downloadTime====
> installTime====
> extInstallTime====
> serverStartTime====
> 930fb5b872f4: end
[19:05:25.292] Received install output: 
exitCode==24==
listeningOn====
osReleaseId==ubuntu==
arch==x86_64==
vscodeArch==x64==
bitness==64==
tmpDir==/run/user/1000==
platform==linux==
unpackResult====
didLocalDownload==0==
downloadTime====
installTime====
extInstallTime====
serverStartTime====

[19:05:25.292] Server installation process already in progress - waiting and retrying
[19:05:25.292] Terminating local server
[19:05:25.297] Local server exit: 15
[19:05:26.299] askpass server listening on /var/folders/7r/d08538nj63ncgxpk9jwhpxsc0000gp/T/vscode-ssh-askpass-af8043ee197a0e7fe637f9611c64063e0d87ca8b.sock
# ここで振り出しに戻り、以下エンドレス...
```

## 3-2. 調べたこと

これは私の場合ですが、上記の通りエラーログに、`Address already in use`と書いてありました。
なので念のため、そのポートが動いてないかも確認しました。

```bash:ローカルPCのターミナルで実施
# <port number>のところにsshアクセスするときに使用するport番号を入れてください
$ lsof -i:<port number>

# Example (利用するport番号が 22 の場合)
$ lsof -i:22
```

上記コマンドを打つと、もし22番ポートが利用中であれば、以下のような出力が表示されます。

```bash:bash
$ lsof -i:22
COMMAND   PID       USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
ssh     22069   username    6u  IPv6 0xe2ab4b26dcc553b5      0t0  TCP localhost:22 (LISTEN)
ssh     22069   username    7u  IPv4 0xe2ab4b1d453fbe1d      0t0  TCP localhost:22 (LISTEN)
```

でも、何も出なかったんですよね。。。
already in useって書いてあったのに。使われていない。
幽霊👻じゃん。。。と思いました。

そんな貴方は、私と同じ現象に出くわしている可能性がありますので、 `2. 対処法` を試していただければと思います。

それでもダメでしたら、 `5. 参考資料` に載せた記事が参考になるかもしれません。
他の対処法も書いてあったので、そちらも見ていただければと思います >_<

---

ちなみに、もしportが本当に使われていた場合は、そのサービスを `kill` して下さい。
killの方法については本記事の範囲からは外れるので、他の記事に任せます。

以下の記事はわかりやすいと思います。

https://qiita.com/katsuomi/items/455fa8e19e14d612caf7#%E4%BE%8B88%E7%95%AA%E3%83%9D%E3%83%BC%E3%83%88%E3%82%92%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88



# 4. 終わりに

なんか、原因はわからないんですけど、解決してしまった。何なんでしょうね( ˘·ω·˘ ).。oஇ
数年前も似たようなことは起きてました。

その際も、原因が全くわからず何時間も苦しんだ記憶があったので、記事化しておきました。
ChatGPTに収集されても構わないので、誰かの助けになれば幸いです(o*。_。)o


# 5. 参考資料

## 5-1. MicrosoftのQ&A

https://learn.microsoft.com/en-us/answers/questions/939587/fail-to-ssh-connect-to-ubuntu-vm-using-visual-stud


## 5-2. エラーメッセージ中に`Permission denied`がある場合

同じ症状ではあるものの、エラーメッセージが異なり、 `Permission denied` が含まれている場合があるようです。その場合は次の記事が参考になるかもしれません。

https://qiita.com/akagane99/items/e47eeb48ed9bd6fe96a8