是否可以从客户端设置ClientAliveInterval?

是否可以从客户端设置ClientAliveInterval?

是否可以从客户端(ssh)端为特定连接设置类似 sshd 的内容ClientAliveIntervalClientAliveCountMax

我正在考虑类似的东西ssh -o ClientAliveInterval=15(这显然不起作用,因为 -o 用于客户端/ssh 选项。或者也许是一种将 sshd 选项应用于特定连接的方法。

我的用例是,对于远程端口转发连接,我想设置低值ClientAliveInterval,以便服务器更快地关闭它们。目标是避免陈旧的 sshd 会话保留端口并阻止我重新连接(“错误:侦听端口的远程端口转发失败”)。

注意我是不是寻找ServerAliveInterval或,ServerAliveCountMax因为它们只控制连接的客户端,这对远程端口转发没有帮助。

答案1

如果您可以使用单独的连接仅有的转发端口,即可能使用-N,然后考虑此解决方法:

while echo; do sleep 1; done | ssh user@server 'exec bash -c "while read -t 5; do :; done"'

(包括您自己的端口转发)。

当换行符echo停止到达远程端时,read -t 5最终将失败并且整个远程循环将退出。 SSH 服务器将注意到其子进程已退出,它将终止连接并释放端口。

笔记:

  • read -t不可移植,命令显式调用bash来处理它。
  • 如果 的命令解释器user@serverbash则不需要exec bash;唯一"while read -t 5; do :; done"(而不是'exec bash -c …')将起作用。
  • read -t 5非常简单。您可以开发实现以下概念的代码Interval CountMax

我在笔记本电脑上测试了这种方法,使用实际的远程端口转发 ( -R),而beep不是:从服务器接收消息。当我断开 Wi-Fi 时,蜂鸣声停止了。当我快速重新连接 Wi-Fi 时,蜂鸣声随之而来并持续。但是当我重新连接时晚了几秒钟,本地命令退出,因为它得知 SSH 服务器已按设计终止连接。重要的事情:

  • 还有其他 SSH 连接到同一服务器,由*AliveInterval和管理*AliveCountMax,并且它们幸存下来。这意味着我的特殊连接在没有这些选项的帮助的情况下结束了。如果我在 Wi-Fi 关闭的情况下等待足够长的时间,那么几乎所有连接都会因为这些选项而终止,包括特殊连接的本地一半。例外的是远程一半;无论如何,它早就消失了,因为bash它已经退出了。
  • 我能够再次连接立即地,从来没有得到过remote port forwarding failed for listen port。因此我认为我的方法可以有效解决您的问题。

答案2

不,无法从客户端控制这些设置。它们控制服务器发送保活消息的频率以及断开连接之前等待的数量。这些是服务器范围的设置,适用于所有连接。允许客户端设置它们,即使是针对每个连接,也会产生安全隐患,因为它可能允许恶意客户端消耗过多的服务器资源。

如果您想设置这些设置,则需要在服务器的/etc/sshd/sshd_config文件中进行操作。请注意,将它们设置为快速终止断开的连接应该不是问题,因为通常这些连接最终都会被断开。

相关内容