所以,我正试图运行几个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上运行整个事情,那就很有效。
我已经玩了很多这个,但我无法弄清楚如何正确地逃避这一点,以便它可以工作。有人可以帮忙吗?
答案 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