有时我的SSH会话通过Write failed: Broken pipe消息断开连接。这是什么意思?我如何保持会话开放?

我知道screen,但这不是我要的答案。我认为这是一个sshd配置选项。

#1 楼

服务器可能会关闭闲置时间过长的连接。
您可以更新客户端(ServerAliveInterval)或服务器(ClientAliveInterval

 ServerAliveInterval
         Sets a timeout interval in seconds after which if no data has
         been received from the server, ssh(1) will send a message through
         the encrypted channel to request a response from the server.  The
         default is 0, indicating that these messages will not be sent to
         the server.  This option applies to protocol version 2 only.

 ClientAliveInterval
         Sets a timeout interval in seconds after which if no data has
         been received from the client, sshd(8) will send a message
         through the encrypted channel to request a response from the
         client.  The default is 0, indicating that these messages will
         not be sent to the client.  This option applies to protocol
         version 2 only.


更新服务器(并重新启动sshd

echo "ClientAliveInterval 60" | sudo tee -a /etc/ssh/sshd_config


或客户端:

echo "ServerAliveInterval 60" >> ~/.ssh/config 


评论


注意,有时“ * AliveInterval”不够用stackoverflow.com/questions/10665267/…

–rogerdpack
2015年2月18日在16:33



我的Mac上没有〜/ .ssh / config,我必须在那里创建它还是在别的地方?

– AGamePlayer
2015年9月6日,凌晨3:40

@AwQiruiGuo是的,您应该首先创建目录(〜/ .ssh)。所以mkdir -p〜/ .ssh; chmod 700〜/ .ssh;触摸〜/ .ssh / config

– Gert
2015年9月7日下午6:43

就我而言,确定与闲置无关。我曾经在两个终端同时输入时断开了它们的连接。通常,我不触摸连接然后断开连接的时间通常小于我也不触摸连接同时没有断开连接的时间。我认为,这里值得注意的是,断开连接总是同时存在于我所有的ssh连接中,而不只是其中之一。

– Hi-Angel
20-09-29在14:10

#2 楼

一种替代解决方案是使用mosh-移动外壳。与ssh相反,它通过UDP连接并支持漫游。您可以在家中开始会议,暂停笔记本电脑,将它带到办公室/朋友/在您有互联网的任何地方,取消暂停笔记本电脑并继续工作,就好像什么都没发生一样。如果您的网络连接不畅,此功能特别有用:如果击键未到达服务器并不断尝试重新建立连接,它会显示即时反馈。

安装和设置很简单:现在已包含在所有当前Linux(以及一些非Linux)发行版中,并且它通过先前的ssh连接来协调会话初始化和身份验证。因此,如果您能够通过ssh user@server进行连接,则很可能仅通过调用mosh user@server就能与mosh进行连接(如果两端都安装了mosh软件包)。

连接失败的主要原因是必须通过UDP端口(默认范围:60000-61000)访问服务器,才能使mosh正常工作。因此,如果服务器位于防火墙后面,那么您自己如果自己无法打孔(通常会带来安全隐患),则很不走运。

#3 楼

如果要延长连接时间,请在客户端中添加:

echo 'ServerAliveInterval 30' | tee -a ~/.ssh/config
echo 'ServerAliveCountMax 1200' | tee -a ~/.ssh/config
默认情况下设置为3。因此,一旦ServerAliveCountMax发送了3个小包装信息到您的服务器,它将自动注销。将其设置为1200意味着此过程将至少发生1200次。简而言之,您应该至少连接30 * 1200秒(10小时)。

评论


为什么将sudo用于属于当前用户或尚不存在的文件?

–Hubert Grzeskowiak
18年4月22日在15:11



@HubertGrzeskowiak固定

–弗朗西斯科·科斯塔(Francisco Costa)
20 Mar 25 '20 at 19:21

#4 楼

这通常意味着您的网络(TCP)连接已重置。例如。您的互联网提供商重新连接了您或类似的对象。

#5 楼

“管道中断消息”的另一个原因是另一台计算机尝试使用与主机相同的IP。

一种简单的方法来测试其他人是否正在使用该IP:


关闭主机
使用相同的IP,以查看另一台计算机是否正在使用该IP

要找出网络上有哪些计算机,可以使用此Unix和Linux问题标题:如何查找其他哪些计算机连接到本地网络。

#6 楼

我遇到了同样的问题,但是没有达到预期的效果。如果发现在同一网络上,另一台服务器正在尝试相同的IP地址,则会遇到相同的问题。
要解决此问题,您需要检查是否有其他服务器在使用相同的IP地址。这可以使用arp命令来完成。

我正在使用Debian,所以这里是一些命令示例,用于确定其他服务器是否确实在使用相同的IP地址。

apt-get install arp-scan
arp-scan -I eth0 -l | grep 192.168.1.42
  192.168.1.42 d4:eb:9a:f2:11:a1 (Unknown)
  192.168.1.42 f4:23:a4:38:b5:76 (Unknown) (DUP: 2)


您会注意到两组使用相同IP地址的mac地址。通过将一个IP地址设置为另一个IP地址来避免冲突。

#7 楼

我花了很多时间弄乱ServerAliveInterval和ClientAliveInterval变量。
最后,在与没有断线问题的机器进行比较之后,我在/etc/ssh/sshd_config的底部找到了指令:
KeepAlive yes

将其放在问题服务器的/etc/ssh/sshd_config底部即可。
已针对Ubuntu 20.04.1 LTS,Ubuntu 16.04.7 LTS进行了验证。

#8 楼

您可以使用SSH / SCP参数'-o'来完成此操作,而无需设置(如果您是管理员)服务器的ssh-config。
与保持连接活动有关的SSH选项是TCPKeepAliveServerAliveCountMaxServerAliveInterval。手册页-https://linux.die.net/man/5/ssh_config-可以为您提供一些不错的详细信息,但是基本上是这样的:
% ssh -o TCPKeepAlive=yes -o ServerAliveCountMax=20 -o ServerAliveInterval=15 my-user-name@my-server-domain-name-here

拥有客户端每15秒发送一次“保持活动”消息。如果20条连续消息的限制没有从服务器得到答复(占20x15 = 5 minutes),则可以理解该连接已断开/失效,并且客户端进程结束。