6

我阅读了通过 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

并尝试将单个配额放在命令上,但也不起作用。

感激的帮助

4

2 回答 2

9

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

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

于 2013-12-02T23:05:13.543 回答
7

在您的第一次尝试中,您使用双引号",因此您需要转义$字符:

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

此外,您可以使用:

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

所以你不需要这grep -v grep一步。

于 2013-03-22T10:22:44.947 回答