我通过ssh读取远程命令上的任何逃避单引号的解决方案。但任何工作都会有风险。
我正在尝试
ssh root@server "ps uax|grep bac | grep -v grep | awk '{ print $2 }' > /tmp/back.tmp"
不要工作awk
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
尝试在命令中设置单个配额但也不起作用。
Aprecite帮助
答案 0 :(得分: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
老实说,这感觉有点复杂,但我发现这些知识在处理向远程系统发送命令时非常有价值,这些系统涉及更复杂的引用。
答案 1 :(得分: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
步骤。