SSH 连接冻结,显示“写入失败:管道损坏”

SSH 连接冻结,显示“写入失败:管道损坏”

我正在从 Ubuntu 11.04 机器通过 SSH 连接到 CentOS 5.5 盒。

当连接处于活动状态时(即没有延迟或丢失),连接似乎按预期工作,但如果一段时间不活动,它就会冻结并变得无响应。最终将返回错误消息“写入失败:管道损坏”,我将回到本地计算机的提示符。

我可以做些什么来帮助调试这个问题,找出发生了什么,并解决这个问题?作为一名开发人员,这让我的生活变得很痛苦,不得不不断地重新连接。

答案1

看起来 CentOS 盒的 SSHD 配置没有设置为执行客户端 KeepAlive。

将这两行放入您的 CentOS sshd 配置(/etc/ssh/sshd_config)中,重新启动它,然后享受!

KeepAlive yes
ClientAliveInterval 60

当您这样做时,我建议您使用 gnuscreen来保持您的会话在 CentOS 端处于活动状态。

答案2

实际答案几乎总是您在路径中拥有某种类型的 NAT 设备,通常是防火墙,其状态表具有相当严格的超时限制。由于您将 ssh 连接闲置了一段时间,因此 NAT 设备会“忘记”您的内部地址和源端口号以及您的临时外部 NAT 地址和端口号之间的映射。

当您稍后尝试在该 ssh 窗口中执行某些操作时,系统会为您分配一个新的临时地址/端口对,而目标 ssh 服务器对此一无所知,也不会响应;稍后,达到某个本地超时,您的本地计算机将断开连接。

实际解决方法是完全按照 yuriismaster 的建议去做:启用 KeepAlives(确保定期流量“触发”该状态表条目),并screen在远程端使用(以在发生丢失事件时保留状态)。我之所以发布这个答案,只是因为你问发生了什么,以及该怎么做。希望这能澄清为什么yuriismaster 的建议很好。

相关内容