Skip to content
On this page

ssh接続を維持する方法(Broken pipe)

sshを使用すると、接続が切断されることがよくあります。時には、他の作業をするためにウィンドウから切り替えたり、ターミナルウィンドウに戻ったときにssh接続が切断されていることがあります。この場合、直接何もできませんが、数秒待つと、次のメッセージが表示されます。

sh
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

パラメータの意味は、サーバー側で設定されたものとほぼ同じです。

クライアント側の一時的な解決策

設定を変更するだけでなく、クライアントは接続を開始するときに、次のパラメータを使用してタイマー付きの「ハートビート」を指定することもできます。

sh
ssh -o ServerAliveInterval=60 [email protected]

要約

「ハートビート」を設定すると、sshが理由なく切断されることを心配する必要はもうありません。