SSH 连接因“写入失败:管道损坏”而冻结

Ste*_* RC 12 ubuntu ssh timeout centos

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

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

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

小智 15

看起来 CentOS 机器的 SSHD 配置没有设置为客户端 KeepAlive。

在 CentOS sshd 配置 (/etc/ssh/sshd_config) 中删除这两行,重新启动它,享受吧!

KeepAlive yes
ClientAliveInterval 60
Run Code Online (Sandbox Code Playgroud)

当您使用它时,我建议您使用 gnuscreen来让您的会话在 CentOS 端保持活动状态。


Mad*_*ter 9

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

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

对此的实际解决方法是完全按照 yuriismaster 的建议进行操作:启用 KeepAlives(确保常规流量“处理”该状态表条目),并screen在远程端使用(以在事情确实被删除的情况下保留状态)。我发布这个答案只是因为你问发生了什么,以及如何处理它。希望这可以澄清为什么yuriismaster 的建议是好的。