使用 autossh 的隧道与使用 ssh 的命令行为不同

使用 autossh 的隧道与使用 ssh 的命令行为不同

我正在尝试在两台主机之间建立双 ssh 隧道,以便我可以通过它代理流量。

使用常规 SSH 命令,我已使以下操作正常运行:

    ssh -t -L2000:localhost:2000 user@host1 ssh -D 2000 differentuser@host2

我对此命令的理解是“将我的本地端口 2000 转发到第一个远程主机上的端口 2000,然后将第一个远程主机上的本地端口 2000 视为第二个远程主机的 SOCKS 代理”。我已将相关公钥复制到每个主机,因此每个步骤都不需要密码。

一切正常,直到其中一个连接断开。然后我尝试使用 autossh 来解决这个问题,例如:

    autossh -t -L2000:localhost:2000 user@host1 autossh -D 2000 differentuser@host2    

但它一直显示:

    bind: Address already in use
    channel_setup_fwd_listener: cannot listen to port: 2000

然而,我确实从第二台主机获得了 shell 提示,但隧道没有工作。然后我尝试在第一和第二台主机之间使用不同的端口,如下所示:

    autossh -t -L2000:localhost:2001 user@host1 autossh -D 2001 differentuser@host2

这没有产生任何错误,但最终的隧道仍然不起作用。手动执行以下步骤,例如:

    autossh -L2000:localhost:2000 user@host1

然后在主机 1 上:

    autossh -D 2000 differentuser@host2

运行完美。不过,我希望使用一个命令完成所有操作,这样我就可以编写脚本。

有人能帮助我让 autossh 执行与常规 ssh 相同的行为吗?

谢谢!

答案1

非常好的问题。我刚刚做了一些测试,它看起来对命令行的最后一个“命令”部分的ssh处理autossh方式不同。例如:

$ ssh 0 ls -ld /tmp
tom@0's password: 
drwxrwxrwt 16 root root 4096 2011-06-05 11:17 /tmp
$ autossh 0 ls -ld /tmp
d@'s password:

autossh正在解析最终命令并解释标志,而不是像 那样将它们放在一边ssh。在本例中,它将 解释-l为指定远程用户的标志。在您的情况下,它将 解释为-D第一个 的选项autossh,而不是第二个 的选项。

您可以通过将命令部分放在引号中来解决此问题。在您的示例中:

autossh -t -L2000:localhost:2000 user@host1 "autossh -D 2000 differentuser@host2"

相关内容