Macのsshで「Write failed: Broken pipe」が出た場合の対処法




投稿日:

MacのSSHを利用していて、「Write failed: Broken pipe」が出たらそれはsshでの接続が切れたことを意味します。
ある一定の時間、SSHで通信が発生しないと自然に切断してしまいます。これはlinux/unixのエコシステムなので当然のことです。ただ、この症状で困っている場合は、自分のMACクライアント端末か接続先のサーバのどちらかに設定を加える必要があります。

接続元になる Macクライアントで対処する場合

接続先のサーバの管理が自分では出来ない場合は、自分が利用しているMac端末を直すのが手っ取り早いです。自分の端末に設定を加えることで将来どんな端末につないだ際にも「Write failed: Broken pipe」という症状が出る事がなくなります


Macのターミナルにて、以下を実行。

vi .ssh/config

# 以下の1行を追加し、保存
ServerAliveInterval 15

# 15秒間隔で、サーバに応答確認を送る設定です。

ほとんどの場合、こちらの対応で大丈夫です。


接続先のサーバで対処する場合

以下のように設定を加えます。

vi /etc/ssh/sshd_config
# 300秒で切れる設定にします。

ClientAliveInterval 300
ClientAliveCountMax 0



それぞれの設定は以下のような意味になります。
http://www.unixuser.org/~euske/doc/openssh/jman/sshd_config.html より引用

ClientAliveCountMax (クライアントの生存チェック最大カウント数)
sshd (8) が無反応のクライアントに対してclient alive message (下記参照) を送ってみる最大数を指定します。client alive message に対する応答が連続してこの回数だけなかった場合、sshd は接続を切り、セッションを終了します。client alive message は、TCPKeepAlive(下記) とはまったく違うことに注意してください。client alive message は暗号化された経路を介して送られるので、偽造されることはありません。TCPKeepAliveによって設定される TCP の keepalive オプションは偽造される可能性があります。client alive のメカニズムはクライアントあるいはサーバが、いつ接続が切れたのかを知りたいときに役立ちます。
デフォルトの値は 3 です。もしClientAliveInterval(下記) が 15 に設定され、ClientAliveCountMaxがデフォルトのままである場合、これに反応できない SSH クライアントはおよそ 45 秒後に接続が切られます。この設定項目は プロトコル バージョン 2 でのみサポートされています。

ClientAliveInterval (クライアントの生存チェック間隔)
sshd (8) は一定時間ごとに、暗号化された通信路を経由してクライアントに応答を要求するメッセージ(client alive message) を送ります。その際、何もデータが送られてこなかったらタイムアウトする時間を秒数で指定します。デフォルトの値は 0 で、これはメッセージを送らないことを意味します。この設定項目は プロトコル バージョン 2 でのみサポートされています。


参考

http://snickerjp.blogspot.jp/2013/03/tipsmacssh.html
http://www.unixuser.org/~euske/doc/openssh/jman/sshd_config.html