即使连接失败,SSH 进程仍保持活动状态?

即使连接失败,SSH 进程仍保持活动状态?

当尝试建立 ssh 隧道时,我注意到即使连接失败,进程也会保持活动状态。例如,如果我尝试在hostname关闭时运行此命令:

/usr/bin/ssh -f -i /home/user/.ssh/id_rsa -N -R 3000:localhost:22 user@hostname

有时我会得到这样的回应:

Warning: remote port forwarding failed for listen port 3000

仅当原始进程(在本地计算机上运行)终止但远程服务器尚未意识到时,我才会收到此错误消息。该进程尝试重新启动,但服务器认为它仍然有 3000 上的连接,并且不会排除新连接,从而导致出现上述警告。

但如果我这样做,pgrep -x ssh我可以看到该进程仍然存在。我想在 cronjob 中运行此 ssh 命令作为 bash 脚本的一部分,该命令首先检查隧道是否已建立,如果没有则重新建立它,但是我设置脚本的方式 a) 看到隧道是关闭并尝试创建一个新进程(这会秘密失败),或者 b) 看到失败的进程仍然存在并且不执行任何操作。结果是,只要失败的进程仍然存在,隧道就永远不会重新建立。

如果连接失败,有没有办法直接终止进程而不是收到警告?

答案1

对于其他可能找到答案的人,我找到了我想要的选项这个答案-o ExitOnForwardFailure=True在命令中添加强制 ssh 在端口转发失败时退出,而不是创建僵尸进程:

/usr/bin/ssh -f -i /home/user/.ssh/id_rsa -N -R 3000:localhost:22 user@hostname -o ExitOnForwardFailure=True

答案2

尝试一下 ClientAliveInterval。

人 sshd_config

     ClientAliveInterval
         Sets a timeout interval in seconds after which if no data has been received from the client, sshd(8) will send a message through
         the encrypted channel to request a response from the client.  The default is 0, indicating that these messages will not be sent
         to the client.

相关内容