我找到了这个问题,但是很抱歉,我不太了解接受的响应中提到的两个变量ServerAliveIntervalClientAliveInterval的设置。如果我的本地服务器超时,是否应该将此值设置为零?它将永远不会超时吗?我应该改为将其设置为300秒还是什么时间?如何正确配置本地sshd,以使它们不会因管道损坏而失败?

#1 楼

ServerAliveInterval:客户端在向服务器发送空数据包之前(等待连接保持活动状态)要等待的秒数。客户端(以保持连接保持活动状态)。

将值设置为0(默认值)将禁用这些功能,因此如果空闲时间过长,连接可能会断开。 /> ServerAliveInterval似乎是使连接保持活动状态的最常见策略。为了防止管道破裂的问题,这是我在.ssh / config文件中使用的ssh配置:客户端将等待空闲60秒钟(ServerAliveInterval时间),然后向服务器发送“ no-op null数据包”,并期望得到响应。如果没有响应,则它将继续尝试上述过程直到10(ServerAliveCountMax)次(600秒)。如果服务器仍然没有响应,则客户端将断开ssh连接。

服务器端的ClientAliveCountMax也可能会有所帮助。这是允许客户端断开连接之前保持无响应时间的限制。默认值为3,如在三个ClientAliveInterval中。

评论


好的,所以我将零秒解释为暗示“不要存活”,这就是为什么它不轮询客户端/服务器?

– M. Tibbits
10-10-12在16:33

yup 0 =不发送空数据包。另一个不同之处是,在客户端配置中设置了ServerAliveInterval,而在服务器配置中设置了ClientAliveInternal。

– Barthelemy
10-10-12在16:37

这似乎是防止闲置导致超时的好建议,但我不明白它与防止客户端挂起时防止管道中断的OP问题有何关系。处于睡眠状态时,客户端将无法发送空数据包,因此确定此设置没有意义吗?

– Sparhawk
13-10-6在2:12

当然,ServerAlive部分是。 ClientAliveInterval / ClientAliveCountMax在这里会有所帮助。

–javawizard
2014年9月29日19:53

回顾这个旧答案,我相信回答的是标题中的问题,而不是第二段中的问题,因此,我同意关于ServerAliveInternal的评论没有帮助暂停。 @JonasWielicki ClientAliveInterval在挂起的情况下可能很糟糕,因为被挂起的客户端将不会应答服务器,并且在ClientAliveCountMax之后服务器最终将断开客户端的连接。

– Barthelemy
17年1月16日在10:35



#2 楼

sshd_config手册(man sshd_config)中对此进行了说明:

ClientAliveInterval
设置超时间隔(以秒为单位),在此间隔之后,如果未从客户端接收到任何数据,则sshd将通过加密通道发送消息向客户端请求响应。默认值为0,表示这些消息将不会发送到客户端。此选项仅适用于协议版本2。
ClientAliveCountMax
默认值为3。如果ClientAliveInterval(请参见下文)设置为15,而ClientAliveCountMax保留默认值,则无响应的SSH客户端将在连接后断开大约45秒。此选项仅适用于协议版本2。

有关客户端选项,请参阅man ssh_config中的说明:

ServerAliveInterval
设置以秒为单位的超时间隔,如果没有收到来自服务器的数据,ssh将通过加密的通道发送一条消息,以请求服务器的响应。默认值为0,表示这些消息将不会发送到服务器。此选项仅适用于协议版本2。
ServerAliveCountMax
默认值为3。例如,如果ServerAliveInterval设置为15,而ServerAliveCountMax保留默认值,则服务器无响应时,ssh将大约45秒后断开连接。此选项仅适用于协议版本2。

基于上述,0表示已禁用。因此,应将这些值设置得足够高,以免发生管道破裂的错误。

评论


有用的帖子。但是我对此感到非常沮丧。我在整个地方都设置了较大的间隔,仅几分钟后,我的连接仍然断开。 (在Ubuntu上使用openssh,不确定是否相关)

– Sridhar Sarnobat
17年7月21日在22:18



@ user7000同时配置客户端(ssh)和服务器(sshd)。这可能会有所帮助:如何解决“远程连接意外关闭SSH连接”的问题。

– Kenorb
17年7月21日在23:08



我想我要去某个地方。可能是我没有在配置文件中的ServerAliveInterval之前放置空格。

– Sridhar Sarnobat
17年7月28日在17:34



顺便说一句,似乎最好将ClientAliveInterval设置为0或更小,并同时减小ClientAliveCountMax,否则,如果有很多ssh登录,随着时间的流逝,它将使ssh服务卡住,并使ssh不时失败。

–特朗普2020年-正义将到来
19/12/18在8:50

#3 楼

Barthelemy的回答很酷,但是并不能真正解决问题的根源。
您要挂起计算机,并希望在启动计算机时SSH会话仍然有效。

ssh没有这样的配置可以使连接保持活动状态。当您关闭/休眠时,所有TCP连接都将用FIN关闭。

要解决此问题,您可以使用VPS或另一个带有屏幕的在线包装盒来保持连接。我的建议出于安全原因不建议这样做。

评论


我认为安全性是不安全的,因为它可能是比登录时更安全的计算机。只需确保其安全即可。这是我每天工作的方式,在强化的跳转主机上保持几个多窗格(gnus屏幕)打开。因此它并不是很脏,它实际上是非常有效的解决方案,使用一个跳转主机,并且在ssh配置上也包含了保持活动参数。

–布赖恩·托马斯(Brian Thomas)
20-4-17在20:50



#4 楼

由于您无法保证一旦一端停止向已接收的数据包发送ACK,SSH连接(即TCP)仍将保持活动状态,因此我个人使用http://www.harding.motd.ca/autossh/重新启动所有SSH连接

由于GNU Screen将在服务器端使用,因此重新连接使我回到了以前的状态。

侦听额外的端口,以便它可以连续检查连接是否仍然存在,但是我个人认为它可以很好地工作,并且可以禁用它,并且仅依靠SSH自己的ServerAliveInterval / ServerAliveCountMax。 /mosh.mit.edu/使用UDP并从长期缺乏连接性的情况下无缝恢复。

#5 楼

如果希望不管您的SSH连接如何运行命令,也可以使用nohup运行命令。

例如

$ nohup tar -xzf some_huge.tar.gz &

&是,我认为没有必要,但是它很方便,因为它使进程在后台运行,因此您可以做其他事情。如果由于某种原因失去连接,则必须重新开始-电源中断(在我的远程位置,显然不是在主机上),网络中断,无论如何。

评论


注意zsh上的nohup无法正常工作!

– Sridhar Sarnobat
17年7月21日在20:42

@ user7000有什么不当之处?

–瓶Butkus
17年7月21日在22:11

我不记得了,我认为在客户端断开连接后,它基本上没有使进程继续运行。那是几年前的事,我停止使用nohup并改用disown。

– Sridhar Sarnobat
17年7月21日在22:17

我想zsh用户应该坚持disown -h而不是nohup,除非此后问题已解决。

–瓶Butkus
17年7月21日在22:19

#6 楼

将长时间运行的会话置于屏幕内
有关详细信息,请参见屏幕-h

这样,您可以使用ssh重新连接至计算机并重新连接至屏幕会话