Answers:
ServerAliveInterval:客户端在向服务器发送空数据包之前(等待连接保持活动状态)将等待的秒数。
ClientAliveInterval:服务器在向客户端发送空数据包之前(等待连接保持活动状态)将等待的秒数。
将值设置为0(默认值)将禁用这些功能,因此如果空闲时间太长,连接可能会断开。
ServerAliveInterval似乎是使连接保持活动状态的最常见策略。为防止管道破裂问题,这是我在.ssh / config文件中使用的ssh配置:
Host myhostshortcut
HostName myhost.com
User barthelemy
ServerAliveInterval 60
ServerAliveCountMax 10
以上设置将以以下方式工作,
服务器端的ClientAliveCountMax也可能会有所帮助。这是允许客户端在断开连接之前保持无响应时间的限制。默认值为3,如在三个ClientAliveInterval中一样。
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表示已禁用。因此,您应该将这些值设置得足够高,以免发生管道破裂的错误。
ServerAliveInterval
在配置文件中放置空格。
巴泰勒米的答案很酷,但并没有真正找到问题的根源。您挂起了计算机,并希望在启动计算机时SSH会话仍然有效。
ssh没有这样的配置可以像这样保持连接。SSH使用TCP,首先,您需要进行三向握手,然后在空闲一段时间后保持活动状态。当您关闭/休眠时,所有的TCP连接都使用FIN关闭。没有办法克服这一点。
对于肮脏的解决方法,您可以使用VPS或另一个带有屏幕的在线包装盒来保持连接。我的建议出于安全原因不建议这样做。
由于您无法保证一旦一端停止向已接收的数据包发送ACK,SSH连接(即TCP)仍将保持活动状态,因此我个人使用http://www.harding.motd.ca/autossh/重新启动所有SSH连接我几乎没有任何悬念。
由于GNU Screen将在服务器端使用,因此重新连接使我回到了以前的状态。
您可以让它在其他端口上侦听,以便它不断检查连接是否仍然有效,但是就我个人而言,我发现它在禁用了该功能并且仅依靠SSH自己的ServerAliveInterval
/时就可以很好地工作ServerAliveCountMax
。
另一个选择是http://mosh.mit.edu/,它使用UDP并从长期缺乏连接性的情况下无缝恢复。
nohup
如果希望无论您的SSH连接如何运行命令,也可以使用它们。
例如
$ nohup tar -xzf some_huge.tar.gz &
的&
,我认为,没有必要的,但它很方便,因为它使得在后台运行的进程,所以你可以做其他的东西。
我总是将nohup用于需要一段时间的任何进程,这样,无论出于什么原因(电源中断(在我的远程位置,而不是主机上),网络中断等等),如果我失去连接,就不必重新开始。
zsh
用户应该坚持使用disown -h
而不是nohup
,除非此后已解决问题。
将长时间运行的会话置于屏幕内。有关详细信息,请参见屏幕-h
这样,您可以使用ssh重新连接到计算机并重新连接到屏幕会话