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

  • 本文关键字:命令 SSH bash ssh
  • 更新时间 :
  • 英文 :


这是我拥有的命令,它有效

这只是一个带有返回数字的表达式的杀戮

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"'

不起作用,我的猜测是它与"混淆了。

尝试的选项

转义 kill 命令中的大部分 ' :

 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 命令

删除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在您想要的地方获得多个参数,等等。 它完全打破了意义。

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

如果您使用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'

最新更新