900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > linux ssh 报错 Write failed: Broken pipe 解决方法

linux ssh 报错 Write failed: Broken pipe 解决方法

时间:2021-02-07 21:23:46

相关推荐

linux ssh 报错 Write failed: Broken pipe 解决方法

目录

原理

方法1:通过客户端配置

方法2:服务器端配置

方法3:临时SSH命令配置

总结

在使用SSH连接远程服务器的时候,如果长时间不操作,再次进入 Terminal 时就会有卡死一段时间没有响应。等待一段时间以后,会发现以下错误提示:

Write failed: Broken pipe

同时SSH连接已经断开。有时候还会出现界面卡死没有响应的情况。最终只能重新打开终端进行连接。

原理

为了保证服务器的资源不被浪费,系统会对SSH的连接定期进行自动回收(即自动断开),其回收原则为:一个连接在规定的限制时间内没有数据传输就认定为超时,然后就会主动断开连接。基于这个原则,如果想要保持连接,只需要在超时前发送一个空数据包即可。

解决方法

从安全和资源利用的角度考虑,长时间的连接都是不合适的,尤其是一些长期连接还没有操作的。所以为了解决这个问题,服务器在指定时间会进行判断连接状态,然后判断是否判断连接。了解了这个原理,我们可以以下三个方案来解决问题。

方法1:通过客户端配置

在客户端的~/.ssh/ config文件(如不存在请自行创建)中添加下面内容:

ServerAliveInterval 60

参数ServerAliveInterval是让客户端上以60秒的时间间隔,向目标服务器发送空消息以保持连接。这个参数一般和ServerAliveCountMax一起使用,ServerAliveCountMax用于指定在服务器没有响应时,继续尝试发消息的次数(默认值:3)。

请看以下的示例,我们为某服务器指定了相应的参数写到~/.ssh/config配置文件中:

Host serv01HostName xxx.xxx.xxx.xxxUser rootServerAliveInterval 60 # 每60秒发送一个空包以保持连接ServerAliveCountMax 10 # 如果发送不成功,最多尝试10次Host serv02HostName xxx.xxx.xxx.xxxUser root

在这个示例中,我们配置了两台服务器serv0serv02。保持连接的配置是为serv01设置的,因此只有serv01有效,而对sev02无效。

方法2:服务器端配置

在服务器的/etc/ssh/sshd_config中添加如下的配置:

ClientAliveInterval 60ClientAliveCountMax 10

ClientAliveInterval: 服务器上设置的发送空消息至服务器的秒数以保持连接。上边的配置里我还开启了ClientAliveCountMax 10,它的作用是60秒钟发送一次心跳,如果连续10次都没有响应,服务器端就断开连接。

方法3:临时SSH命令配置

如果只是临时性的连接(即只作用于当前SSH),可以直接使用 ssh 命令参数进行配置。

$ ssh -o ServerAliveInterval=60 user@sshserver

总结

方法一和方法三是客户端主动发消息,而方法二是服务器端主动发消息。这两方法各有利弊,简单说一下区别。

对于客户端在线状态相对自由,可以随时上线和下线。这样的话,如果下线了,那么就无法继续发送消息,这样即使设置了ServerAliveInterval=60,消息因掉线而无法发出。所以超时后,仍然会掉线。

对于服务器端,在设置了防掉线后,如果客户端掉线了,会根据ClientAliveCountMax进行反复测试,如果超过测试次数,仍然也会掉线。所以总体上可靠性比客户端的方式更好。不过需要注意的事,当服务器的连接数量较多时会产生一定的资源浪费。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。