如何防止SSH连接上的“写失败:断管”?

如何在客户端和服务器上配置SSH以防止Write Failed: broken pipe错误? 如果您睡眠客户端计算机并稍后恢复,通常会发生这种情况

我在/etc/ssh/ssh_config为Linux和Mac试过这个:

 Host * ServerAliveInterval 120 

这是以秒为单位向服务器发送keepalive消息的频率。 如果这不起作用,那么训练一只猴子在你工作的时候每隔两分钟按一次。

您可以在客户端计算机的/etc/ssh/ssh_config中设置ServerAliveInterval ,或在服务器计算机的/etc/ssh/sshd_config中设置/etc/ssh/sshd_config 。 如果仍然出现错误,请尝试缩短间隔。

可以在服务器和客户端的文件~/.ssh/config设置单个用户的~/.ssh/config 。 确保文件具有正确的权限chmod 644 ~/.ssh/config

由于众多且可能不可避免的原因,SSH会话可能会中断。

可用于缓解由此引起的问题的有用实用程序称为screen 。 屏幕是一个function强大的实用程序,允许您控制多个终端,这些终端将独立于ssh会话保持活动状态。 例如,如果您在ssh会话中运行screen ,您将看到一个新的终端打开,您可以使用它来运行作业。 让我们说你的ssh会话在这个过程中死亡。 运行screen -d然后screen -r将重新打开上一个会话,您将能够从那里继续。 在使用之前,请务必阅读一些文档 。

客户端配置

尝试创建文件:

 ~/.ssh/config 

添加内容:

 Host * ServerAliveInterval 30 ServerAliveCountMax 5 

现在ssh到您的服务器,看看您的问题是否已修复。 ClientAliveInterval选项仅在配置ssh服务器(也称为sshd)时有用,它不会更改ssh客户端上的内容,因此请勿在上述配置文件中使用它。

如果在前30秒内没有收到数据包(如上所述),这将向服务器发送一个hello-are-you-there信号。 但是,如果连续的hello-are-there信号的数量达到ServerAliveCountMax,那么ssh将与服务器断开连接。 此值默认为3(因此3 * 30 = 90秒没有服务器活动),如果它符合您的需要,请增加它。 .ssh / config文件有很多配置选项,您可以阅读:

使用SSH配置文件

有关其他选项的更多信息。 您可能不希望将此应用于您连接到此示例的每个服务器。 或者通过将Host *替换为Host (仅用IP地址替换,请参见ssh_config手册页)将其限制为仅特定服务器。

服务器配置

同样,您可以告诉服务器与您的客户保持温和。 配置文件是/etc/ssh/sshd_config

 ClientAliveInterval 20 ClientAliveCountMax 5 

您可以通过将ClientAliveInterval设置为0来停用它,或者调整ClientAliveIntervalClientAliveCountMax以设置最大ssh客户端不活动而不响应探测。 这种设置优于TCPKeepAlive的一个优点是信号通过加密通道发送,因此不太可能是可欺骗的。

我正在远程将Ubuntu服务器从lucid升级到精确,并在升级过程中丢失了ssh连接,并显示消息“Write failed.Brocken pipe”。 ClientAliveInterval和ServerAliveInterval什么也没做。 解决方案是在客户端ssh中打开TCPKeepAlive选项:

 TCPKeepAlive yes 

 /etc/ssh/ssh_config 

对于客户端,编辑~/.ssh/config (或/etc/ssh/ssh_config )文件,如下所示:

 Host * TCPKeepAlive yes ServerAliveInterval 120 

TCPKeepAlive – 指定系统是否应将TCP keepalive消息发送到另一端。 如果它们被发送,将正确地注意到其中一台机器的连接或崩溃的死亡。 但是,这意味着如果路由暂时关闭,连接将会死亡,并且有些人发现它很烦人(默认为’是’)。

ServerAliveInterval – 设置超时间隔(以秒为单位),之后如果未从服务器收到任何数据,ssh(1)将通过加密通道发送消息以请求服务器响应。 默认值为0,表示不会将这些消息发送到服务器。


对于服务器,将/etc/ssh/sshd_config编辑为:

 ClientAliveInterval 600 ClientAliveCountMax 0 

如果您希望ssh客户端在10分钟(600秒)后自动退出(超时)。

ClientAliveCountMax – 这表示ssh服务器发送的checkalive消息总数,但没有从ssh客户端获得任何响应。 默认值为3。

ClientAliveInterval – 以秒为单位指示超时。 在x秒后,ssh服务器将向客户端发送一条消息,要求响应。 Deafult为0(服务器不会向客户端发送消息以进行检查。)。


另请参阅: sshd_config中的ServerAliveIntervalClientAliveInterval选项具有哪些function?

我绝对喜欢莫什。 我经常ssh到服务器,关闭我的笔记本电脑,去咖啡馆,打开它,继续,好像什么都没有改变。

莫什(手机壳)

远程终端应用程序,允许漫游 ,支持间歇性连接 ,并提供用户击键的智能本地回显和行编辑。

Mosh是SSH的替代品。 它更强大,更灵敏,特别是在Wi-Fi,蜂窝和长途链路上。

Mosh是免费软件,可用于GNU / Linux,FreeBSD,Solaris,Mac OS X和Android。

对我来说,即使我在vim中主动输入或在shell提示符下输入,我仍然会Write failed: Broken pipe 。 我也无法在本地浏览互联网一段时间。 (我使用终端远程连接到Ubuntu。)

我网络中的其他人从Netflix和其他地方传输了大量video。 我无法certificate这一点,但我怀疑它是ISP或路由器问题。 例如,Verizon和Netflix正在互相指责客户的网络问题。

如果您有拨号连接,并且同时使用SSH或Telnet连接流式传输video或音乐,那么在某些时候您将不可避免地收到管道消息。 升级我的ISP宽带套餐似乎使我断开连接的频率降低。

无论SSH配置客户端或服务器如何,我在远程服务器上都有一个似乎永远不会失败的脚本。

 #!/bin/bash while true; do date; sleep 10; done; 

将它保存到一些dummy.sh文件,并在最小化窗口或远离窗口之前快速运行它。 它将继续在服务器上打印当前时间戳,并且只要连接没有被任何其他原因丢弃,就可以使您的连接保持活动状态。 当你回到那个终端时,只需按CTRL + C并继续工作。

每次调用ssh时都可以添加这些参数: -o ServerAliveInterval=15 -o ServerAliveCountMax=3

如果这样做,您不必编辑/ etc / ssh / *配置文件。

您可以创建一个bash别名或函数或脚本来简化这一过程。

例如,这些bash函数,您可以添加到.bashrc中,do_ssh用于手动打开keepalive。 在脚本中使用do_ssh_pty来设置pty并避免提示。

 do_ssh() { ssh -o ServerAliveInterval=15 -o ServerAliveCountMax=3 $* } do_ssh_pty() { ssh -tt -o "BatchMode=yes" -o "StrictHostKeyChecking=no" -o ServerAliveInterval=15 -o ServerAliveCountMax=3 $* } 

现在可以使用do_ssh user@host do_ssh user@host 并且keepalive将处于活动状态。