如何防止SSH连接上的“写入失败:管道损坏”?


283

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


8
真的没什么。会话被中断,会话的安全性受到损害。如果您不让计算机进入睡眠状态,则可以为客户端设置一个“保持活动”时间,以向服务器发出“保持活动”的心跳,但是如果系统即将进入睡眠状态,则无能为力。
darkdragn 2012年

3
在这种情况下,我正在寻找可以让我重新启动断开的ssh连接(可能基于退出代码)并使用screen?恢复的东西。
sorin 2012年

4
你们错了:我有两台台式机客户端计算机连接到SAME服务器。其中之一是Quantal的ubuntu 12.10,其SSH客户端运行良好,并保持了数小时的连接。另一个是Ubuntu 14.10,Utopic,位于另一个位置,并且是全新安装的。几分钟后,它会用此消息阻止自己。机器中的其余网络功能不会中断。因此,不是,这既不是网络问题,也不是服务器问题,而是可以解决的特定SSH CLIENT软件问题,与“ darkdragan”敢说的“无能为力”相反。
David L

2
确实,正如我说的那样:人们在说“无能为力”时会说太多话,就像@darkdragn胆敢。我读了Aram Kocharyan的答案,然后应用了它:20分钟前……我意识到,在两年前的旧版Quantal Ubuntu 12.10中,我已经将该指令应用到了该文件中(我刚刚检查过),那是那里稳定的原因。我在这里做了,在最近的20分钟内,此后连接一直稳定。因此,请人们:在敢于认为“无能为力”时要克制自己,在试图将信息传达给其他人时要克制自己。
David L

11
@DavidL您应该在朗读之前更好地阅读问题。您的问题与OP的问题不同,后者明确提到使计算机进入睡眠状态。顺便说一句,其中只有一个回答地址(“ mosh”),并且在问题发布两年后发布。但是,其他答案则是下一个最好的选择,那就是针对像您这样更容易解决的案例提出解决方案。放松一下,别那么紧张,在这里乱叫没有任何好处……
msb 2015年

Answers:


266

我已经在/etc/ssh/ssh_configLinux和Mac上尝试过此操作:

Host *
ServerAliveInterval 120

这是它应该在几秒钟内向服务器发送一个保持活动消息的频率。如果这不起作用,则在工作时训练猴子每两分钟按一次Enter键。

您既可以设置ServerAliveInterval/etc/ssh/ssh_config客户机或ClientAliveInterval/etc/ssh/sshd_config服务器的机器。如果仍然出现错误,请尝试减少间隔。

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


4
我不在Mac上,但是Ubuntu 12.04和该操作系统的文件也似乎是〜/ .ssh / config。
H2ONaCl 2012年

5
OS X 10.8.4给出了一个错误Bad configuration option: ClientAliveInterval
ohho,2013年

3
Bad configuration option在OSX 10.8.4上遇到了同样的错误。
Nick Heiner

10
通常,您将这两个命令放入系统的不同部分。在OSX客户端上只有ServerAliveInterval ...而在sshd配置文件上只有
ClientAliveInterval

2
我的猴子对我说:“为什么不在“ [回车]前”输入自己的
名字?

85

SSH会话可能由于多种(可能是不可避免的)原因而中断。

可以用来减轻由此引起的问题的有用工具称为screen。Screen是一个功能强大的实用程序,可让您控制多个终端,这些终端将独立于ssh会话而保持活动状态。例如,如果您screen在ssh会话中运行,您将看到一个新的终端打开,您可以使用它来运行作业。假设您的ssh会话在此过程中死亡。运行screen -d然后screen -r将重新打开上一个会话,您将可以从那里继续。使用前,请确保您已阅读一些文档


5
这可能是最好的答案,我不确定为什么它没有获得较高的投票。其他“修补程序”在特殊情况下很有用,在这种情况下,您实际上会关心维护SSH连接,但是在大多数用例中,我认为真正的担忧是预期的进程将继续运行,而不管任何客户端/服务器连接问题如何。
Paul McMurdie

16
我还将Tmux添加为屏幕的替代品。我发现它比屏幕更通用,更稳定。
fridaymeetssunday

2
只需将其留在此处以供将来参考-您可以方便地运行screen -d -r以恢复上一个会话。
doplumi

2
或者干脆screen -dr。或screen -x取决于您打算做什么。关键是,人们应该知道所有这些开关的作用,以便人们可以使用适当的开关,而不仅仅是盲目地遵循互联网人士的建议。这里有一个不错的紧凑摘要:ss64.com/bash/screen.html
flith

这不是解决问题的方法
user3728501

46

客户端配置

尝试创建文件:

~/.ssh/config

添加内容:

Host *
  ServerAliveInterval 30
  ServerAliveCountMax 5

现在,将ssh连接到服务器,看看问题是否已解决。ClientAliveInterval选项仅在配置ssh服务器(也称为sshd)时才有用,它不会在ssh客户端上更改任何内容,因此不要在上面的配置文件中使用它。

如果在前30秒内未收到任何数据包(如上所述),这将向服务器发送“您好”的信号。但是,如果连续有“您好”的信号达到ServerAliveCountMax,则ssh将与服务器断开连接。该值默认为3(因此3 * 30 = 90秒,无服务器活动),如果适合您的需要,可以增加该值。.ssh / config文件还有很多配置选项,您可以阅读:

使用SSH配置文件

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

服务器配置

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

ClientAliveInterval 20
ClientAliveCountMax 5

您可以通过设置ClientAliveInterval0或进行调整来停用它,ClientAliveIntervalClientAliveCountMax设置最大的ssh客户端不活动状态而无需响应探针。与TCPKeepAlive相比,此设置的优点之一是信号通过加密通道发送,因此不太可能被欺骗。


没用 我再次遇到相同的错误。
user997704 2013年

3
直接从命令行尝试并降低它:ssh -o ServerAliveInterval = 5 user @ host
Matt

也尝试过..不起作用。我真的不知道我的系统正在发生什么
user997704 2013年

2
是ClientAliveCountMax,不是ClientAliveMaxCount
David G

@DavidG请编辑您的更正答案。
CivMeierFan

23

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

TCPKeepAlive yes

/etc/ssh/ssh_config

20

对于客户端,请按照以下步骤编辑您的~/.ssh/config(或/etc/ssh/ssh_config)文件:

Host *
  TCPKeepAlive yes
  ServerAliveInterval 120

TCPKeepAlive-指定系统是否应将TCP Keepalive消息发送到另一侧。如果发送了它们,则将正确地注意到连接中断或其中一台计算机崩溃。但是,这意味着如果路由暂时断开,连接将终止,并且有些人会觉得烦(默认值为“是”)。

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


对于服务器,将您的/etc/ssh/sshd_configas 编辑为:

ClientAliveInterval 600
ClientAliveCountMax 0

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

ClientAliveCountMax –这表示ssh服务器发送的未收到ssh客户端任何响应的校验消息的总数。默认值为3。

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


另请参见:选项ServerAliveIntervalClientAliveIntervalsshd_config中的功能是什么?


将ServerAliveCountMax设置为高于客户端上的默认值也应有助于保持连接处于活动状态以进行慢速连接。
jonnyjandles '18 -10-1

17

我绝对爱莫什。我经常去服务器,合上笔记本电脑,去咖啡馆,打开它,然后继续进行,就好像什么都没变一样。

莫什(手机壳)

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

Mosh替代了SSH。它更加健壮和响应迅速,尤其是在Wi-Fi,蜂窝和长途链路上。

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


6

对我来说,Write failed: Broken pipe即使我正在积极地输入vim或在shell提示符下,我也得到了帮助。我也无法在本地浏览互联网一段时间。(我正在使用Terminal远程连接到Ubuntu。)

我网络中的其他人从Netflix和其他地方流式传输许多视频。我无法证明,但我怀疑它是ISP或路由器问题。例如,Verizon和Netflix为客户的网络问题互相指责。

如果您具有拨号连接,并且同时通过SSH或telnet连接流式传输视频或音乐,则不可避免的是,您会收到中断的管道消息。升级ISP的宽带包似乎使我断开连接的频率降低了。


3

我在远程服务器上有一个脚本,该脚本似乎永远不会失败,无论使用SSH配置客户端还是服务器。

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

将其保存到一些dummy.sh文件中,并在最小化窗口或将其移开之前快速运行它。只要不会由于其他任何原因断开连接,它将继续在服务器上打印当前时间戳,并使连接保持活动状态。当您回到该终端时,只需按CTRL + C并继续工作即可。


9
或者干脆离开top运行
埃本格尔


1

您可以在每次调用ssh时添加以下参数: -o ServerAliveInterval=15 -o ServerAliveCountMax=3

如果执行此操作,则不必编辑/ etc / ssh / * config文件。

您可以创建一个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 <args> <command>和keepalive处于活动状态。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.