sshd_config 中的选项`ServerAliveInterval` 和`ClientAliveInterval` 究竟做了什么?

M. *_*its 217 ssh configuration

我发现了这个问题,但很抱歉,我不太了解这两个变量的设置,ServerAliveIntervalClientAliveInterval在接受的回复中提到。如果我的本地服务器超时,我应该将此值设置为零吗?那么它永远不会超时吗?我应该将其设置为 300 秒还是什么?

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

Bar*_*emy 280

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

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

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

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

Host myhostshortcut
     HostName myhost.com
     User barthelemy
     ServerAliveInterval 60
     ServerAliveCountMax 10
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 这似乎是防止空闲导致超时的好建议,但我不明白它与防止客户端挂起时管道损坏的 OP 问题有何关系。当睡眠时,客户端将无法发送空包,所以这个设置肯定没有实际意义吗? (10认同)
  • 是的 0 = 不发送空包。另一个不同之处是 ServerAliveInterval 在客户端配置中设置,而 ClientAliveInternal 在服务器配置中设置。 (4认同)
  • 回顾这个旧答案,我相信回答了标题中的问题,而不是第二段中的问题,因此有关 ServerAliveInternal 的评论对暂停没有帮助,我同意这一点。@JonasWielicki ClientAliveInterval 在挂起的情况下可能会很糟糕,因为挂起的客户端不会应答服务器,并且服务器最终会在 ClientAliveCountMax 之后断开客户端连接。 (4认同)
  • “设置值 0(默认值)将禁用这些功能,因此如果闲置时间过长,您的连接可能会断开。” 不,零值意味着当客户端和服务器之间失去连接时(例如路由暂时关闭时),您的连接不会中断。这与由于空闲而断开连接无关。 (2认同)

ken*_*orb 45

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


小智 22

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

ssh 没有这样的配置可以像这样保持连接活跃。SSH 使用 TCP,首先您需要三向握手,然后在空闲时间后保持活动状态。当您关闭/休眠时,所有 TCP 连接都将使用 FIN 关闭。没有办法克服。

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


小智 17

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

由于 GNU Screen 将在服务器端使用,重新连接使我回到以前的位置。

您可以让它监听额外的端口,以便它不断检查连接是否仍然存在,但我个人发现它在禁用该端口的情况下运行良好,并且仅依赖于 SSH 自己的ServerAliveInterval/ ServerAliveCountMax

另一种选择是http://mosh.mit.edu/,它使用 UDP 并从长期缺乏连接中无缝恢复。


小智 7

将长时间运行的会话放在 screen 内 请参阅 screen -h 了解详细信息

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

  • 或 [tmux](https://github.com/tmux/tmux/wiki),与 [screen](https://www.gnu.org/software/screen/) 类似,但开发更活跃 (2认同)

But*_*kus 5

nohup如果您希望它们在不考虑 SSH 连接的情况下运行,您也可以运行命令。

例如

$ nohup tar -xzf some_huge.tar.gz &

&是,我认为,没有必要的,但它很方便,因为它使得在后台运行,所以你可以做其他的东西的过程。

我总是将 nohup 用于任何需要一段时间的过程,这样如果我因任何原因失去连接,我就不必重新开始 - 停电(在我的远程位置,显然不是在主机上),网络中断,等等。

  • 我猜 `zsh` 用户应该坚持使用 `disown -h` 而不是 `nohup`,除非问题从那时起得到解决。 (2认同)