通过ssh

时间:2017-01-18 00:52:08

标签: bash ssh quotes

我有一个命令,我正在尝试通过SSH运行,但我不知道如何在引号中正确包装它。以下是2次尝试,没有一次是我想要的。

A)命令用双引号括起来

version=1.1
ssh nrichard@myserver.com "
    cd /home/nrichard/${version}
    ls | while read filename ; do 
        echo $filename
        hive -f $filename &
    done"
  

这将能够转到正确的目录/home/nrichard/1.1   但是while循环不起作用,因为在通过ssh发送命令之前,$ filename被空字符串替换。   另一方面......

B)命令用单引号

包装
version=1.1
ssh nrichard@myserver.com '
    cd /home/nrichard/${version}
    ls | while read filename ; do 
        echo $filename
        hive -f $filename &
    done'
  

这将无法转到正确的目录/home/nrichard/1.1。它将尝试转到'/ home / nrichard / $ {version}',它不是存在的目录,也不是我要去的目录。   但是while循环可以正常工作。

关于如何使这项工作的任何想法?

2 个答案:

答案 0 :(得分:2)

如果您想以磁盘上的其他文件为代价摆脱任何引用问题,请尝试此操作。 在单独的(本地)文件中,键入要在远程主机上执行的命令。他们会使用正常的引用(就像你通常在命令行中使用的那样)。 cat name_of_file_containing_commands | ssh user @ host bash 管道文本到bash会导致执行此文本(它也可以在本地工作,尝试一下)。在这种情况下,您只需使用ssh作为“网络管道”。 当然,你也可以避免无用的猫: ssh user @ host bash< name_of_file_containing_commands

答案 1 :(得分:1)

如何使用双引号括起整个内容来转义您不希望shell扩展的变量?

version=1.1
ssh nrichard@myserver.com "
    cd /home/nrichard/${version}
    ls | while read filename ; do 
        echo \$filename
        hive -f \$filename &
    done"