2016-09-28 66 views
0

我有,像这样在重新启动时启动一个反向的SSH隧道主机:反向SSH隧道无法绑定到端口时,隧道将被拆除并重新启动

ssh -N -R 2222:localhost:22 [email protected] 

它的伟大工程,形成反向隧道。但每当我重新启动主机,该隧道是建立在远程服务器上这样说:

Sep 28 13:13:59 kali sshd[4547]: error: bind: Address already in use 
Sep 28 13:13:59 kali sshd[4547]: error: channel_setup_fwd_listener_tcpip: cannot listen to port: 2222 

为了让我解决此我不得不等待几分钟,老SSH隧道超时,然后找到新的SSH连接并杀死它,然后当我重建SSH隧道它工作正常。

是否有ssh命令或autossh命令执行类似于检查远程主机是否可以绑定该端口的命令,如果不是,请在几秒钟后重试?

+0

你可以'while/bin/true;做ssh -N ...;完成“ - 只要隧道失败,这将重新启动ssh进程。无论何时重启服务器 - 这是否意味着正常的重置或重启?如果是优雅的话,尝试在重新启动之前使用'TERM'信号终止ssh客户端(应该自动完成,但可能不会发生) – Misko

+0

ssh连接已建立,但无法打开远程服务器上的端口2222 。我希望隧道不能建立,如果它不能绑定到该端口。我正在进行平稳的重启。 –

回答

0

我相信我遇到了与原始海报相同的问题。我似乎找到了在this question接受的答案结束了解决方案:

如果客户端的连接已终止服务器之前重新连接,您可以在情况最终在新的ssh连接是活,但没有端口转发。为了避免这种情况,您需要在客户端使用ExitOnForwardFailure关键字。

我已经在客户端这样添加下面一行到我/etc/ssh/ssh_config文件:

ExitOnForwardFailure yes 

按照ssh man page,此选项将导致“一个客户端开始与-f [于]等待所有远程端口都将在成功建立之前成功建立“。

这似乎导致ssh尝试在杀死一个ssh隧道后立即启动失败。因此,该选项可以重复尝试,直到隧道正确重新建立。