0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Qiita全国学生対抗戦Advent Calendar 2023

Day 16

ssh接続を最速で再接続する

Last updated at Posted at 2023-12-15

/darallium/です!ご覧いただきありがとうございます。 😊

本日は「ssh接続を最速で再接続する」方法を紹介します:relaxed:

introduction

僕はメインで用いる開発環境を自鯖に置いてオンライン化している。
小さな開発ではいまだに手元のエディタを使うことは当然ある。しかし、多くの時間ではやはりリモート接続先で開発しているのだ。

そこで、ある問題が発生する。Windows OSの環境でターミナルを開いているとき、リロードがめんどくさいのである。

この記事では、開発環境をオンライン化するにあたって起きた問題の一つを解決する方法を提示する。

問題

Windows OS環境では多くの人がWindows Terminalを使用しているだろう。筆者も利用している。

Windows Terminalを使用しているとき、あるプラクティスとして「sshコマンドを直接プロファイルに置くことで、よくアクセスするサーバーに簡単にアクセスできるようになる」というライフハックがある。~/.ssh/conf.d/以下に十分に設定していることを前提とすれば、ssh <user>@<Host>を記述すればよい。

しかし、ここである問題が発生する。開発をするとき、設定をいじった影響で環境を再読み込みしたい場合がある。vscodeならば、ctrl + shift + p + reload windowであろう。これを、ssh環境下で行う、すなわち接続を絶った場合には、一番親のプロセスが死んでしまいタブが閉じてしまうのだ。タブが閉じてしまった場合、専用のショートカットキーを割り当てていない限りマウス操作が必要になってしまうのだ。

解決法

  1. 以下を.bashrcに記述する。

    if [ -n "$SSH_CONNECTION" ] ; then
      reload ()
      {
        exit 1
      }
    fi
    
  2. Windows Terminalの対称のプロファイルの「プロファイルの終了時の動作」を自動またはプロセスが正常に終了したときのみ閉じるに設定する。

  3. relaodコマンドでターミナルを終了する

man sshを眺めていたところ、SSH接続中にセットされる環境変数があることに気が付いた。SSH_CONNECTIONである。これは、SSH接続元とそのポートを記述している環境変数らしい。

実際にssh接続先でやってみたところ、以下のようになった。
確かに、手元の環境が記述されている。

$ env | grep SSH
SSH_CONNECTION=<localip 1> <localport 1> <localip 2> <localport 2>
SSH_CLIENT=<localip 1> <localport 1> <localport 2>
SSH_TTY=/dev/pts/0

そして、Windows Terminalには以下のようなオプションがある。
image.png

プロセスが正常に終了したときのみ閉じる
⇔プロセスが異常終了したら閉じない

ここで、linuxのexitコマンドは、引数に終了時の値=エラーレベルを記述できる。異常終了は0以外をセットしてやればよい。

referencing

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?