it-swarm.cn

sshd_config中的ServerAliveInterval和ClientAliveInterval有哪些选项呢?

我发现 此问题 ,但是很抱歉,我不太理解接受的响应中提到的两个变量ServerAliveIntervalClientAliveInterval的设置。如果我的本地服务器超时,是否应该将此值设置为零?它将永远不会超时吗?我应该改为将其设置为300秒左右吗?

我的问题很简单,当我挂起然后用响应Write failed: Broken pipe取消挂起笔记本电脑时,我的一些连接会超时,而有些则不会。如何正确配置本地sshd,以使它们不会因管道损坏而失败?

177
M. Tibbits

ServerAliveInterval客户端在向服务器发送空数据包之前等待的秒数(以保持连接有效) 。

ClientAliveInterval服务器在向客户端发送空数据包之前等待的秒数(以保持连接有效) 。

设置为0(默认值)将禁用这些功能,因此如果空闲时间太长,连接可能会断开。

ServerAliveInterval似乎是使连接保持活动状态的最常见策略。为防止管道破裂问题,这是我在.ssh/config文件中使用的ssh配置:

Host myhostshortcut
     HostName myhost.com
     User barthelemy
     ServerAliveInterval 60
     ServerAliveCountMax 10

以上设置将以以下方式工作,

  1. 客户端将等待空闲60秒钟(ServerAliveInterval时间),然后向服务器发送“ no-op null数据包”,并期望响应。如果没有响应,则它将继续尝试上述过程直到10(ServerAliveCountMax)次(600秒)。如果服务器仍然没有响应,则客户端将断开ssh连接。

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

227
Barthelemy

这在 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表示已禁用。因此,您应该将这些值设置得足够高,以避免管道破损错误。

29
kenorb

巴特勒米的答案很酷,但并没有真正找到问题的根源。您挂起计算机,并希望在启动计算机时SSH会话仍然有效。

Ssh没有这样的配置可以像这样保持连接。 SSH使用TCP,首先,您需要进行三向握手,然后在空闲一段时间后保持活动状态。当您关闭/休眠时,所有的TCP)连接都已用FIN关闭。没有办法解决。

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

20
3h4x

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

因为GNU屏幕将在服务器端使用,所以重新连接使我回到以前的位置。

您可以让它在额外的端口上侦听,以便它不断检查连接是否仍然有效,但是就我个人而言,我发现它在禁用该功能并且仅依靠SSH自己的ServerAliveInterval/ServerAliveCountMax的情况下仍能很好地工作。

另一个选择是 http://mosh.mit.edu/ ,它使用UDP并从长期缺乏连接性的情况下无缝恢复。

16
grifferz

如果希望无论SSH连接如何都运行它们,也可以使用Nohup运行命令。

例如.

$ Nohup tar -xzf some_huge.tar.gz &

我认为&不是必需的,但是它很方便,因为它使进程在后台运行,因此您可以执行其他操作。

我总是将Nohup用于需要一段时间的任何进程,因此,无论出于什么原因(电源中断(在我的远程位置,而不是主机上),网络中断等等),如果我失去连接,都不必重新开始。

5
Buttle Butkus

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

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

1
user180529