当尝试建立 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.