如何正确转义此ssh命令?

时间:2014-04-15 19:43:09

标签: bash shell ssh

所以,我正试图运行几个ssh跳的命令。 命令本身如下:

ls /usr/local/patch/clone.example.com*|zip - -q@|base64

当我在交互式shell上运行它时,这很好用,我得到了base64编码的zip文件。

但是,当我运行时:

ssh -Aqt hop1.example.com ssh -Aqt hop2.example.com 'ls /usr/local/patch/clone.example.com*|zip - -q@|base64'

我回来了: zip error: Nothing to do! (-)

正如@ shx2所指出的那样,如果在hop1的shell中只使用一个ssh,我会得到同样的错误。

我应该注意,如果我只是运行ls,就像这样:

ssh -Aqt hop1.example.com ssh -Aqt hop2.example.com 'ls /usr/local/patch/clone.example.com*'

它确实给了我正确的文件列表,我希望看到压缩文件。再说一次,如果我在目的地的交互式shell上运行整个事情,那就很有效。

我已经玩了很多这个,但我无法弄清楚如何正确地逃避这一点,以便它可以工作。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

ssh -o ProxyCommand="ssh -W %h:%p hop1.example.com" hop2.example.com \
  'zip - /usr/local/patch/clone.example.com* | base64'

使用嵌套的ssh命令,您需要引用模式两次,这样它就不会在您的本地主机上展开,并且再次如此,它不会被'在传递给hop2.example.com之前,在hop1.example.com上展开。使用ProxyCommand可以避免将命令暴露给hop1.example.com上的shell。此外,将文件列表作为参数直接传递给zip优于读取ls的输出,这将在文件名包含换行符的(罕见)情况下中断,但也避免了运行{的不必要的额外进程{ {1}}。

如果通过hop1.example.com连接到许多不同的主机,则可以将ProxyCommand添加到本地ls文件中。此示例显示了如何仅为hop2.example.com设置它,但您可以指定匹配多个主机名的模式,而不是单个主机名。

.ssh/config

然后,你可以简单地运行

Host hop2.example.com
    ProxyCommand ssh -W %h:%p hop1.example.com