我发现这个问题,但很抱歉,我不太了解接受的响应中提到的ServerAliveInterval
两个变量的设置。ClientAliveInterval
如果我的本地服务器超时,我应该将此值设置为零吗?那么它永远不会超时吗?我应该将其设置为 300 秒还是其他值?
我的问题很简单,当我暂停然后通过响应取消暂停我的笔记本电脑时,我的一些连接超时,Write failed: Broken pipe
而另一些则没有。如何正确配置本地 sshd,使其不会因管道损坏而失败?
答案1
服务器活动间隔:秒数客户将在向服务器发送空数据包之前等待(以保持连接处于活动状态)。
客户端活动间隔:秒数服务器将在向客户端发送空数据包之前等待(以保持连接处于活动状态)。
设置值 0(默认值)将禁用这些功能,因此如果闲置时间过长,连接可能会断开。
ServerAliveInterval 似乎是保持连接活动的最常见策略。为了防止管道损坏问题,这是我在 .ssh/config 文件中使用的 ssh 配置:
Host myhostshortcut
HostName myhost.com
User barthelemy
ServerAliveInterval 60
ServerAliveCountMax 10
上述设置将按以下方式工作,
- 客户端将空闲等待 60 秒(ServerAliveInterval 时间),并向服务器发送“无操作空数据包”并期待响应。如果没有响应,那么它将继续尝试上述过程,直到 10 (ServerAliveCountMax) 次(600 秒)。如果服务器仍然没有响应,则客户端断开 ssh 连接。
服务器端的 ClientAliveCountMax 也可能有帮助。这是允许客户端在断开连接之前保持无响应的时间限制。默认值为3,即3个ClientAliveInterval。
答案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 表示已禁用。因此,您应该将这些值设置得足够高以避免管道破裂错误。
答案3
巴泰勒米的答案很酷,但并没有真正触及问题的根源。您挂起计算机并希望 SSH 会话在启动计算机时仍处于活动状态。
ssh 没有这样的配置可以使连接保持活动状态。 SSH 使用 TCP,一开始您需要三向握手,然后在一段空闲时间后保持活动状态。当您关闭/休眠时,所有 TCP 连接都会通过 FIN 关闭。没有办法克服这一点。
对于肮脏的解决方法,您可以使用 VPS 或其他带屏幕的在线盒子来保持连接。我的建议是出于安全原因不要这样做。
答案4
将长时间运行的会话放在 screen 内 请参阅 screen -h 了解详细信息
这样您就可以使用 ssh 重新连接到计算机并重新连接到屏幕会话