代码之家  ›  专栏  ›  技术社区  ›  abkrim

转义单引号ssh远程命令

  •  6
  • abkrim  · 技术社区  · 13 年前

    我读过任何关于通过ssh执行远程命令时转义单引号的解决方案。但任何工作都可以。

    我正在努力

    ssh root@server "ps uax|grep bac | grep -v grep | awk '{ print $2 }' > /tmp/back.tmp"
    

    别胡作非为

    ssh root@server "ps uax|grep bac | grep -v grep | awk \'{ print $2 }\' > /tmp/back.tmp"
    ....
    awk: '{
    awk: ^ caracter ''' inválido en la expresión
    

    并尝试将单个配额置于命令之下,但也不起作用。

    背诵帮助

    2 回复  |  直到 13 年前
        1
  •  9
  •   Ben    12 年前

    这个 ssh 命令将在主机名之后键入的所有文本视为要执行的远程命令。关键的是,这对你的问题意味着你不需要像你所做的那样引用整个命令。相反,您可以像在远程系统上一样,通过键入命令来发送命令。

    这简化了报价问题的处理,因为它减少了您需要使用的报价数量。由于您不会使用引号, 所有特殊的bash字符都需要用反斜杠进行转义 .

    在你的情况下,你需要键入,

    ssh root@server ps uax \| grep ba[c] \| \'{ print \$2 }\' \> /tmp/back.tmp
    

    或者您可以对单引号进行双引号引用,而不是转义(在这两种情况下,您都需要转义美元符号)

    ssh root@server ps uax \| grep ba[c] \| "'{ print \$2 }'" \> /tmp/back.tmp
    

    老实说,这感觉有点复杂,但我发现这些知识在处理向涉及更复杂的引号使用的远程系统发送命令时非常有价值。

        2
  •  7
  •   Adrian Pronk    13 年前

    在你的第一次尝试中,你使用了双引号 " 所以你需要逃离 $ 字符:

    ssh root@server "ps uax|grep bac | grep -v grep | awk '{ print \$2 }' > /tmp/back.tmp"
                                                                   ▲
    

    此外,您还可以使用:

     ps uax | grep 'ba[c]' | ...
    

    那么你就不需要 grep -v grep 步