如何在命令(ssh)中正确编写命令?

时间:2015-06-17 14:06:09

标签: bash ssh

这是我的命令

这只是一个带有表达式的kill,它返回一个数字

kill $(ps -ef | grep '[m]atchbox-panel --titlebar --start-applets showdesktop,windowselector' | cut -f8 -d' ') &> /dev/null

这是我通常使用的ssh

bash -c 'timeout  120s ssh -o StrictHostKeyChecking=no root@192.168.155.XXX "cd NightTest"'

我尝试将两者结合起来

bash -c 'timeout  120s ssh -o StrictHostKeyChecking=no root@192.168.155.148 "kill $(ps -ef | grep '[m]atchbox-panel --titlebar --start-applets showdesktop,windowselector' | cut -f8 -d' ') &> /dev/null"'

它不起作用,我的猜测是它与''混合起来。

尝试过的选项

逃避杀戮命令中的大部分'

 bash -c 'timeout  120s ssh -o StrictHostKeyChecking=no root@192.168.155.148 "kill $(ps -ef | grep \'[m]atchbox-panel --titlebar --start-applets showdesktop,windowselector\' | cut -f8 -d\' ') &> /dev/null"'

也不要工作,我做了很多其他尝试,但无法使其发挥作用。

有什么想法吗?

添加了备注

我的系统不支持pkill命令

2 个答案:

答案 0 :(得分:3)

如果使用pkill来杀死所需的进程,会更容易。它一次性执行搜索和查杀。

pkill -f 'matchbox-panel --titlebar --start-applets showdesktop,windowselector'

然后你可以把它扔进SSH呼叫:

bash -c 'timeout 120s ssh -o StrictHostKeyChecking=no root@192.168.155.148 pkill -f "matchbox-panel --titlebar --start-applets showdesktop,windowselector"'

顺便说一句bash -c的目的是什么?如果你能摆脱它,那就更简单了。

timeout 120s ssh -o StrictHostKeyChecking=no root@192.168.155.148 pkill -f 'matchbox-panel --titlebar --start-applets showdesktop,windowselector'

答案 1 :(得分:3)

删除bash -c表示法。假设您没有重写命令以使用pkill,那么您需要以下内容:

timeout 120s ssh -o StrictHostKeyChecking=no root@192.168.155.148 \
    'kill $(ps -ef | grep "[m]atchbox-panel --titlebar --start-applets showdesktop,windowselector" | cut -f8 -d" ") &> /dev/null'

请注意,我在命令中使用了双引号来执行。幸运的是,命令中没有任何内容可以使用单引号或双引号。

带有“嵌入式单引号”的版本不起作用,因为您无法在单引号字符串中嵌入单引号。如果必须,您可以编写'…'\''…'以在两个省略号之间获得单引号。第一个'终止当前单引号字符串(即使前面的字符是反斜杠;单引号字符串中没有转义); \'生成单引号;中心组中的第三个'将再次恢复单引号字符串。

因此,在你的尝试中:

bash -c 'timeout  120s ssh -o StrictHostKeyChecking=no root@192.168.155.148 "kill $(ps -ef | grep \'[m]atchbox-panel --titlebar --start-applets showdesktop,windowselector\' | cut -f8 -d\' ') &> /dev/null"'

Bash命令看到:

timeout  120s ssh -o StrictHostKeyChecking=no root@192.168.155.148 "kill $(ps -ef | grep \[m]atchbox-panel --titlebar --start-applets showdesktop,windowselector\ | cut -f8 -d\ ) &> /dev/null"

这意味着grep获得了多个参数,你想要一个,等等。它完全破坏了意义。

嵌套引用约定很难 - 真的很难。