sshで接続して作業してる時に、 暫く他の事をしていて接続していたターミナルに戻ると
Read from remote host example.com: Connection reset by peer
Connection to example.com closed.
みたいに切れてしまっている事があります。
これはルーターの設定などで一定時間(早ければ10分程度で)その接続に通信が無いと切ってしまうからです。
この様な環境下で一定時間を過ぎても接続を維持できる様にする方法について。
維持する原理
原理、というほどではありませんが、 要するに何もしてないと切られてしまうわけなので、 サーバー側かクライアント側から何か送ったりしてあげれば良いわけです。
で、sshなどにはそのような機能がついてたりするのでそれを使います。
勿論ルーター自体の設定を変更してしまえば良いわけですが、 以下はそうもいかない場合の対処法です。
サーバー側で設定する場合
サーバー側でいじれる場合には/etc/ssh/sshd_configに次の様な設定を 追加してsshdをリスタートします。
ClientAliveInterval 60
ClientAliveCountMax 3
ClientAliveInterval
はサーバーがクライアントに向かって
つながっているか確かめるメッセージを送って
それがタイムアウトになる時間を秒数で設定します。
デフォルトは0で、0だとメッセージを送りません。
ClientAliveCountMax
の方は、タイムアウトになった際に試してみる回数です。
最初の試行を入れて、で、
3であれば、ClientAliveInterval
が60の場合、
合計で60x3の180秒待つことになります。
デフォルトは3です。
ClientAliveInterval
の設定を行うと一定時間ごとに通信を送るので、
繋がっていればルーターによって自動で切断されることはなくなります。
(極度に長くしてルーターの切断タイミングより長くしてしまうとダメですが。)
また、この設定を行うと、逆にきちんと接続されてないと この間隔で確認されて、サーバー側から切られる様にもなります。
sshd_configを書き換えたら
$ sudo /etc/init.d/sshd restart
でsshdを再起動(通常のLinuxサーバーの場合)。
クライアント側の設定
サーバーもいじれないことは多いと思うので、 大概の場合はこれで対処することのなると思います。
上の場合ではサーバー側から応答を求めるメッセージを送りましたが、 クライアント側からも送ることが出来ます。
設定するには~/.ssh/configに以下の行を加えます。
ServerAliveInterval 60
ServerAliveCountMax 3
ややこしいですが、サーバーが生きてるかどうか確かめるなので、
クライアント側での設定はServerAlive*
で、
サーバー側での設定がClientAlive*
になります。
これもサーバー側のものと同じで、
ServerAliveInterval
がメッセージを送ってタイムアウトになる秒数
(デフォルト0(=送らない))、
ServerAliveCountMax
が試行回数(デフォルト3)です。
取り敢えずこれを書いておけば何処へつなげても 間のルーターに勝手に遮断されることはなくなります。
PuTTYの場合
PuTTYではPuTTY自身で無害なパケットを送って通信をキープするHeartbeat機能がついています。
設定画面のConnectionを開くと、一番上に Sending of null packets to keep session activeという項目があって、 Seconds between keepalive (0 to turn off)という設定項目があります。
これを0から60等に変えることで、上のServerAliveInterval
の設定と同じように
通信を定期的に行って遮断されるのを防いでくれます。
この様な機能はTeraTermなどにもついてるようです。
参考: