sshで接続したあと操作せずに一晩捨ておくと知らぬ間に「Write failed: Broken pipe」というメッセージが表示されてセッションが切断されている。再度、接続し直すのも手間であるから設定を取り繕って切断されぬようにするものである。
$ vi ~/.ssh/config Host * ServerAliveInterval 30 ServerAliveCountMax 10
ServerAliveIntervalはサーバからデータが送られてこなくなってから何秒後に応答を求めるメッセージを投げつけるか定める模様である。デフォルトではそもメッセージを放たないという。メッセージの中身をtcpdumpで覗いてみるとPSHフラグを立てたパケットを送りつけているようであった。
$ sudo tcpdump -n -i ens3 port 22 (snip) 22:50:30.488309 IP 192.0.2.1.55773 > 153.121.51.164.22: Flags [P.], seq 72:108, ack 109, win 305, options [nop,nop,TS val 1047147664 ecr 177098205], length 36 22:50:30.488696 IP 153.121.51.164.22 > 192.0.2.1.55773: Flags [P.], seq 109:145, ack 108, win 309, options [nop,nop,TS val 177105717 ecr 1047147664], length 36 22:50:30.506156 IP 192.0.2.1.55773 > 153.121.51.164.22: Flags [.], ack 145, win 305, options [nop,nop,TS val 1047147668 ecr 177105717], length 0 22:51:00.536025 IP 192.0.2.1.55773 > 153.121.51.164.22: Flags [P.], seq 108:144, ack 145, win 305, options [nop,nop,TS val 1047155176 ecr 177105717], length 36 22:51:00.536334 IP 153.121.51.164.22 > 192.0.2.1.55773: Flags [P.], seq 145:181, ack 144, win 309, options [nop,nop,TS val 177113229 ecr 1047155176], length 36 22:51:00.554444 IP 192.0.2.1.55773 > 153.121.51.164.22: Flags [.], ack 181, win 305, options [nop,nop,TS val 1047155180 ecr 177113229], length 0 (snip)
ServerAliveCountMaxはサーバからの反応が無くなった際、応答を呼びかけるメッセージを何回送りつけるかを定め、これを超えたら切断してセッションを終える模様である。デフォルトでは3回という取り決めであった。したがって概ね
ServerAliveInterval ✕ ServerAliveCountMax
秒の間、サーバから返答がなければTimeout, server hostname not responding.というようなメッセージと共に切断するというものである。
参考:
man ssh_config
How to prevent “Write Failed: broken pipe” on SSH connection?