こんにちは、たびとです。
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 をダウングレードする必要があります。
この記事の対象者
拡張機能 Remote - SSH
VS Code の 拡張機能 Remote - SSH は、VS Code の拡張機能タブから簡単にインストールすることができます。
拡張機能 Remote - SSH の詳細は、以下のサイトを参照してください。
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 接続すると、パスワードを入力するボックスは表示されなくなり、 代わりにターミナルが表示されます。このターミナルに表示された「password:」にパスワードを入力することになります。
パスワードを入力すると、接続の詳細が表示さるため、 ここから自分用の SSH 接続 ID を取得することができます。
ここに表示された 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 をダウングレードする必要があります。