砂漠の旅人(たびと)

UNIX / MS-DOS 時代から電脳砂漠を旅しています

【トラブル解決】VS Code が Linux サーバに SSH 接続できなくなった

こんにちは、たびとです。

Linux の g++ で開発するとき、Visual Studio Code拡張機能 Remote - SSH を使って、 開発していますが、ときどき接続できくなるトラブルが発生します。

SSH接続が失敗するとき、GitBash の scp コマンドでローカルドライブにコピーしたり、 直接 vi コマンドで編集したりしていました。 いろいろと調べるうちに、SSH 接続トラブルを解決する方法を発見しました。

VS Code 1.86 以降の場合、CentOS 7, Debian 9, Oracle Linux 7, RedHat Enterprise Linux 7, Ubuntu 18.04 がサポート対象外となるため、VS Code をダウングレードする必要があります。

sabakunotabito.hatenablog.com

この記事の対象者

  • Linux サーバ上のファイルを VS Code を使って編集したい。
  • Linux サーバ上で何らかの言語を使って開発している。

拡張機能 Remote - SSH

VS Code拡張機能 Remote - SSH は、VS Code拡張機能タブから簡単にインストールすることができます。

Remote - SSH

拡張機能 Remote - SSH の詳細は、以下のサイトを参照してください。

marketplace.visualstudio.com

Linux サーバへ接続する

拡張機能 Remote - SSH をインストール後、画面左下の接続アイコンをクリックすると、 サーバに接続できるようになります。「ホストに接続する」メニューを選択します。

ホストに接続する

「ユーザ名@ホスト名」を入力します。

ユーザ名とホスト名を指定する

新規ウィンドウが起動し、パスワードを入力します。 ただし、初回はサーバの種類などを入力する必要があります。

パスワードを入力する

自分のホームディレクトリに移動します。 画面の左下に接続先の情報が表示されます。ここをクリックするとサーバとの切断メニューも表示されます。 このように、WSL2 Linux の時と同様の感覚でファイル編集ができるようになります。

自分のホームディレクトリに移動する

SSH 接続できないトラブル

拡張機能 Remote - SSH は便利なのですが、まだプレビュー版なのか、 動作が不安定で、SSH 接続できないトラブルが発生することがあります。 何度も接続トラブルに遭遇したため、原因を追究してみました。

拡張機能 Remote - SSH の仕組み

拡張機能 Remote - SSH は、SSH サーバへの接続時に scp で、 ホームディレクトリの .vscode-server 配下へ、SSH 接続用の資源を scp でコピーしているようです。 コピー後に Remote - SSH のプロセスが起動するため、ps コマンドで確認することができます。

$ ps -ef | grep "vscode"
tabito    6308  6256  0 00:29 ?        00:00:00 sh /home/tabito/.vscode-server/bin/6261075646f055b99068d3688932416f2346dd3b/bin/code-server --start-server --host=127.0.0.1 --accept-server-license-terms --enable-remote-auto-shutdown --port=0 --telemetry-level all --connection-token-file /home/tabito/.vscode-server/.6261075646f055b99068d3688932416f2346dd3b.token
tabito    6320  6308  0 00:29 ?        00:00:04 /home/tabito/.vscode-server/bin/6261075646f055b99068d3688932416f2346dd3b/node /home/tabito/.vscode-server/bin/6261075646f055b99068d3688932416f2346dd3b/out/server-main.js --start-server --host=127.0.0.1 --accept-server-license-terms --enable-remote-auto-shutdown --port=0 --telemetry-level all --connection-token-file /home/tabito/.vscode-server/.6261075646f055b99068d3688932416f2346dd3b.token
tabito    6358  6320  0 00:29 ?        00:00:00 /home/tabito/.vscode-server/bin/6261075646f055b99068d3688932416f2346dd3b/node /home/tabito/.vscode-server/bin/6261075646f055b99068d3688932416f2346dd3b/out/bootstrap-fork --type=ptyHost --logsPath /home/tabito/.vscode-server/data/logs/20221114T002931
tabito    6396  6320  0 00:29 ?        00:00:05 /home/tabito/.vscode-server/bin/6261075646f055b99068d3688932416f2346dd3b/node /home/tabito/.vscode-server/bin/6261075646f055b99068d3688932416f2346dd3b/out/bootstrap-fork --type=extensionHost --transformURIs --useHostProxy=false
tabito    6407  6320  0 00:29 ?        00:00:00 /home/tabito/.vscode-server/bin/6261075646f055b99068d3688932416f2346dd3b/node /home/tabito/.vscode-server/bin/6261075646f055b99068d3688932416f2346dd3b/out/bootstrap-fork --type=fileWatcher
tabito    6625  3488  0 00:42 pts/0    00:00:00 grep --color=auto vscode

サーバ側のプロセスを強制終了

上記の vscode-server のプロセスを kill コマンドで強制終了すると、 Windows 側は再接続状態になります。 これは、SSH の接続トラブルが発生したときにも有効です。

例えば、SSH 接続したまま、VS Code をアップデートしたりすると、 SSH 接続できないトラブルが発生することがありました。 この場合、プロセスを強制終了すると接続できるようになりました。

再接続しています

プロセスが起動しない場合

かつて、vscode-server のプロセスが起動しない問題が発生しました。 この場合、サーバ側の .vscode-server/bin 配下のディレクトリを 別のディレクトリ(/tmp など)に移動すると、回復することがあります。

$ cd ~/.vscode-server/bin
$ ls
6261075646f055b99068d3688932416f2346dd3b
$ mv 6261075646f055b99068d3688932416f2346dd3b /tmp

これでダメなら、「.vscode-server 配下」を別ディレクトリに退避して、 最初からやり直してください。

複数のユーザで利用している場合

仕事で使う場合、こちらのケースになると思います。 SSH の設定を変更することで、自分のIDを取得することができます。

設定画面の検索ボックスに「remote.ssh.show」を入力し、SSH ログインターミナルを常に表示します。 の項目を探し、チェックボックスをチェックします。

SSH ログインターミナルを常に表示する

この状態で SSH 接続すると、パスワードを入力するボックスは表示されなくなり、 代わりにターミナルが表示されます。このターミナルに表示された「password:」にパスワードを入力することになります。

ターミナルでパスワードを入力する

パスワードを入力すると、接続の詳細が表示さるため、 ここから自分用の SSH 接続 ID を取得することができます。

SSH 接続の詳細が表示される

ここに表示された SSH 接続 ID '6261075646f055b99068d3688932416f2346dd3b' を使ってプロセスを検索すると、 自分用のプロセスが表示されます。 SSH 接続トラブル発生時は、これらのプロセスを kill することで、 他ユーザのセッションに影響を与えることなく、トラブル解決を実施することが可能です。

ps -ef | grep "6261075646f055b99068d3688932416f2346dd3b"
tabito    7034  6982  0 01:16 ?        00:00:00 sh /home/tabito/.vscode-server/bin/6261075646f055b99068d3688932416f2346dd3b/bin/code-server --start-server --host=127.0.0.1 --accept-server-license-terms --enable-remote-auto-shutdown --port=0 --telemetry-level all --connection-token-file /home/tabito/.vscode-server/.6261075646f055b99068d3688932416f2346dd3b.token
tabito    7046  7034  0 01:16 ?        00:00:02 /home/tabito/.vscode-server/bin/6261075646f055b99068d3688932416f2346dd3 /node /home/tabito/.vscode-server/bin/6261075646f055b99068d3688932416f2346dd3b/out/server-main.js --start-server --host=127.0.0.1 --accept-server-license-terms --enable-remote-auto-shutdown --port=0 --telemetry-level all --connection-token-file /home/tabito/.vscode-server/.6261075646f055b99068d3688932416f2346dd3b.token
tabito    7084  7046  0 01:16 ?        00:00:00 /home/tabito/.vscode-server/bin/6261075646f055b99068d3688932416f2346dd3 /node /home/tabito/.vscode-server/bin/6261075646f055b99068d3688932416f2346dd3b/out/bootstrap-fork --type=ptyHost --logsPath /home/tabito/.vscode-server/data/logs/20221114T011634
tabito    7122  7046  0 01:16 ?        00:00:01 /home/tabito/.vscode-server/bin/6261075646f055b99068d3688932416f2346dd3 /node /home/tabito/.vscode-server/bin/6261075646f055b99068d3688932416f2346dd3b/out/bootstrap-fork --type=extensionHost --transformURIs --useHostProxy=false
tabito    7196  3488  0 01:20 pts/0    00:00:00 grep --color=auto 6261075646f055b99068d3688932416f2346dd3b

まとめ

今回は、拡張機能 Remote - SSH を使って、Linux サーバのファイルを VS Code から編集する方法を紹介しました。 これができると、WSL2 Linux と同様の感覚でファイルが編集できるようになります。 また、他の拡張機能も利用できることが多いため、個人的には必須ツールとなっています。

ただし、このプレビュー版は動作が安定しないためか、SSH 接続できないトラブルに何度も遭遇しました。 SSH 接続トラブルの多くは、サーバ側のプロセスを強制終了することで解決できたので、 トラブルが発生した場合は、今回紹介した解決方法を試してみてはいかがでしょうか。

では、皆さん、よい旅を。

後日談

冒頭にも記載した通り、VS Code 1.86 以降の場合、古い Linux は Remote - SSH 拡張機能による ssh 接続が失敗することがあるため、VS Code をダウングレードする必要があります。

sabakunotabito.hatenablog.com