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

评论

真的没什么。会话被中断,会话的安全性受到损害。如果您不让comp进入睡眠状态,则可以为客户端设置一个“保持活动”时间,以向服务器拍摄“保持活动”的心跳,但是如果系统即将进入睡眠状态,则无法执行任何操作。

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

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

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

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

#1 楼

我已经在适用于Linux和Mac的/etc/ssh/ssh_config中尝试过此操作:

Host *
ServerAliveInterval 120


这是几秒钟一次,它应该向服务器发送一个keepalive消息。如果这不起作用,请在工作时训练猴子每两分钟按一次Enter。

您可以在客户端计算机的ServerAliveInterval中设置/etc/ssh/ssh_config或在服务器计算机的ClientAliveInterval中设置/etc/ssh/sshd_config。如果仍然遇到错误,请尝试减少时间间隔。

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

评论


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

– H2ONaCl
2012-12-14 13:26

OS X 10.8.4给出错误错误的配置选项:ClientAliveInterval

– ohho
13年7月15日在4:46

我在OSX 10.8.4上收到相同的错误配置选项错误。

–尼克·海纳(Nick Heiner)
13年7月18日在19:57



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

–脚丫
13-10-23在22:56

我的猴子对我说:“为什么不在[ENTER]上方键入自己的名字?

–augusto
2015年7月9日在15:34

#2 楼

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

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

评论


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

– Paul McMurdie
2013年6月3日17:33

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

–星期五下午星期日
15年1月5日在15:28

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

– doplumi
16年11月21日在7:41



或只是屏幕-dr。或根据您的计划选择-x屏幕。关键是,人们应该知道所有这些开关的作用,以便人们可以使用适当的开关,而不仅仅是盲目地遵循互联网人士的建议。这里有一个不错的紧凑摘要:ss64.com/bash/screen.html

–花
18年5月28日在6:27

这不是问题的答案

–user3728501
19年4月16日在9:26

#3 楼

客户端配置

尝试创建文件:

~/.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设置为0来停用它,也可以通过调整ClientAliveIntervalClientAliveCountMax来设置最大的ssh客户端不活动状态而无需响应探针。与TCPKeepAlive相比,此设置的优点之一是信号是通过加密通道发送的,因此不太可能被欺骗。

评论


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

–user997704
13-10-6在4:59

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

–马特
13-10-6在10:46



也尝试过..不起作用。我真的不知道我的系统是怎么回事

–user997704
13年11月15日在8:39

它是ClientAliveCountMax,不是ClientAliveMaxCount

– David G
2015年9月5日,1:11

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

– CivMeierFan
16-2-3在17:35

#4 楼

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

TCPKeepAlive yes


in

/etc/ssh/ssh_config


希望这会帮助

#5 楼

对于客户端,请如下编辑您的~/.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服务器发送的未收到
ssh客户端任何响应的checkalive
消息的数量。默认值为3。

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




另请参阅:sshd_config中的ServerAliveIntervalClientAliveInterval选项有什么作用,到底是什么?

评论


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

– jonnyjandles
'18 -10-1在20:29

#6 楼

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


Mosh(移动外壳)

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

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

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


#7 楼

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

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

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

#8 楼

我在这里发布了我的答案,因为它不是Ubuntu VM。

https://unix.stackexchange.com/questions/259225/packet-write-wait-broken-pipe-even-leaving-顶部运行

ssh -o IPQoS=throughput user@host


#9 楼

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

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


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

评论


或只是保持最佳状态

– Eben Geer
2013年12月19日在22:43

或运行tail -f / dev / null

– Mukundhan
20 Mar 28'9:21

#10 楼

您可以在每次调用ssh时添加这些args:-o ServerAliveInterval=15 -o ServerAliveCountMax=3

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

您可以创建一个bash别名或函数或脚本来简化此操作。

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

现在可以使用do_ssh user@hostdo_ssh user@host <args> <command>和keepalive处于活动状态。