我正在尝试在两台主机之间建立双 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"