问题描述
在使用SSH连接远程服务器的时候,如果长时间不操作,再次进入 Terminal 时就会有卡死一段时间没有响应。等待一段时间以后,会发现以下错误提示:
Write failed: Broken pipe
这表示连接管道已经断开,所以只能重进行连接。
解决方法
方法一:客户端配置(SSH出去的这台机器上)
在客户端的 ~/.ssh/ config文件(如不存在请自行创建)中添加下面内容:
ServerAliveInterval 60
方法二:服务器端配置(SSH到的这台机器上)
在服务器的 /etc/ssh/sshd_config 中添加如下的配置:
ClientAliveInterval 60
方法三:临时SSH命令配置(每次SSH都需要添加)
如果只是临时性的连接(即只作用于当前SSH),可以直接使用 ssh 命令参数进行配置。
$ ssh -o ServerAliveInterval=60 user@sshserver
原理
出于保护的资源能够合理利用,系统会对SSH的连接进行自动回收,其回收原则是一个连接在规定的限制时间内没有数据传输就认定为超时,然后就会主动断开连接。基于这个原则,如果想要保持连接,只需要在超时前发送一个空数据包即可。
方法一和方法三是客户端主动发消息,而方法二是服务器端主动发消息。这两方法各有利弊,简单说一下区别。
对于客户端在线状态相对自由,可以随时上线和下线。这样的话,如果下线了,那么就无法继续发送消息,这样即使设置了 ServerAliveInterval=60,消息因掉线而无法发出。所以超时后,仍然会掉线。
对于服务器端,在设置了防掉线后,如果客户端掉线了,会根据 ClientAliveCountMax 进行反复测试,如果超过测试次数,仍然也会掉线。所以总体上可靠性比客户端的方式更好。不过需要注意的事,当服务器的连接数量较多时会产生一定的资源浪费。