【问题标题】:Quotes and parameter substitution over sshssh 上的引号和参数替换
【发布时间】:2017-01-18 00:52:08
【问题描述】:

我有一个命令,我试图通过 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 循环可以正常工作。

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

【问题讨论】:

    标签: bash ssh quotes


    【解决方案1】:

    如果您想以磁盘上的附加文件为代价来解决任何引用问题,请试试这个。

    在单独的(本地)文件中,输入您要在远程主机上执行的命令。他们会使用正常的引用(就像你通常在命令行上使用的那样)。

    cat name_of_file_containing_commands | ssh user@host bash
    

    将文本行管道化到 bash 会导致执行该文本(它也可以在本地工作,试试吧)。在这种情况下,您只需将 ssh 用作“网络管道”。

    你当然也可以避开没用的cat

    ssh user@host bash <name_of_file_containing_commands
    

    【讨论】:

      【解决方案2】:

      如何转义您不希望 shell 扩展的变量,同时使用双引号包裹整个内容?

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

      【讨论】:

      • 感谢@codeforester。这样可行。我会接受答案:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-16
      • 2019-07-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多