隧道使用autossh行为不同于完全相同的命令使用ssh

我试图在两个主机之间build立一个双重ssh隧道,所以我可以通过它来代理stream量。

使用正常的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?

谢谢!

很好的问题。 我刚刚做了一些testing,看起来像sshautossh以不同的方式处理命令行的最后一个“命令”部分。 例如:

 $ 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: 

autosshparsing最终的命令并解释标志,而不是像ssh那样让它们独自一人。 在这种情况下,它将-l解释为指定远程用户的标志。 在你的情况下,它将-D解释为第一个autossh的选项,而不是第二个。

你可以通过把命令部分放在引号中来解决这个问题。 在你的例子中:

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