检测卡住的 SSH 控制主套接字

Dan*_*ski 9 ssh

我经常使用 OpenSSH 的ControlMaster 功能来加速与我经常使用的一些系统的新连接。

\n\n

我的 中有以下内容~/.ssh/config

\n\n
Host *\n    ConnectTimeout 7\n    ControlMaster auto                   \n    ControlPath ~/.ssh/controlmasters/%r@%h:%p\n    ControlPersist 10m    \n
Run Code Online (Sandbox Code Playgroud)\n\n

一般来说,这效果很好。然而,有一个主要的烦恼:如果主机的 ControlMaster 套接字由于网络中断而获取 \xe2\x80\x9chung\xe2\x80\x9d ,ssh that_host则会永远挂起。据我所知,它实际上永远不会放弃现有的 ControlMaster 套接字并尝试创建一个新的。我必须手动ssh -O exit that_host才能工作。

\n\n

我真正希望我能说服ssh做的是放弃并拆除 ControlMaster 套接字(如果它无法在ConnectTimeout.

\n\n

是否有ControlMasterConnectTimeout我缺少的选项?或者我可以通过其他方式说服 ssh 检测并重新启动死的 ControlMaster 套接字?

\n

nhe*_*hed 11

长话短说

Host *
    ServerAliveInterval 11
Run Code Online (Sandbox Code Playgroud)

我猜ConnectTimeout这里不适用,因为主站已经连接了。

这不是特定的ControlMaster,但您可以轻松地将其应用于配置中的相关条目。

您可以使用两种不同的方法来检测失效连接:

  • TCPKeepAlive使用底层套接字中的机制。
  • ServerAliveInterval(直至ServerAliveCountMax连续失败)

我喜欢后者,因为可能会有其他损坏/挂起的东西被拾起,并且手册还提到了欺骗的可能性。

显然你可以选择另一个数字。该变量与(默认 3)相结合ServerAliveCountMax将确定何时断开连接,因此我看到在断开 VPN 连接后大约 33 秒内一切都会消失(我没有准确测量这一点,并注意到一个会话花费了更长的时间,但是我在全球范围内应用了此设置,也许我应该只将其应用于我使用的主机ProxyJump)。