是否可以从客户端(ssh)端为特定连接设置类似 sshd 的内容ClientAliveInterval
?ClientAliveCountMax
我正在考虑类似的东西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@server
是bash
则不需要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
文件中进行操作。请注意,将它们设置为快速终止断开的连接应该不是问题,因为通常这些连接最终都会被断开。