ssh接続を維持する方法(Broken pipe)
sshを使用すると、接続が切断されることがよくあります。時には、他の作業をするためにウィンドウから切り替えたり、ターミナルウィンドウに戻ったときにssh接続が切断されていることがあります。この場合、直接何もできませんが、数秒待つと、次のメッセージが表示されます。
Write failed: Broken pipe
これは非常に生産性の低い状況です。
理由
sshは長時間の接続を使用するため、データ通信がある場合は接続が維持されますが、設定を変更せずにいると、データ通信がない場合に一定時間後にsshが切断され、上記の現象が発生します。
解決策
接続が切断されるのは、データ通信がないためですので、アイドル時間中に定期的にsshが通信を生成することは可能でしょうか?答えは「はい」です。そして、sshのサーバー側とクライアント側の両方が解決策を提供しています。
サーバー側の設定
サーバー側のsshサービスはsshdと呼ばれるため、その設定ファイルは/etc/ssh/sshd_config
であり、このファイルを変更するだけで済みます。
ClientAliveInterval 60
ClientAliveCountMax 5
ClientAliveInterval
は、クライアントに「ハートビート」を送信する頻度を示し、ClientAliveCountMax
は、返信がない場合に切断する回数を示します。したがって、上記の設定は、60秒ごとにクライアントにハートビートを送信し、返信が5回ない場合に切断することを意味します。
設定後にsshdサービスを再起動します:systemctl restart sshd.service
またはservice sshd restart
。
クライアント側の設定
クライアントの設定は、/etc/ssh/ssh_config
にあり、これはグローバルな設定ファイルです。現在のユーザーのみに設定する場合は、~/.ssh/ssh_config
を変更することもできます。
TCPKeepAlive yes
ServerAliveInterval 60
ServerAliveCountMax 5
パラメータの意味は、サーバー側で設定されたものとほぼ同じです。
クライアント側の一時的な解決策
設定を変更するだけでなく、クライアントは接続を開始するときに、次のパラメータを使用してタイマー付きの「ハートビート」を指定することもできます。
ssh -o ServerAliveInterval=60 [email protected]
要約
「ハートビート」を設定すると、sshが理由なく切断されることを心配する必要はもうありません。