【问题标题】:how to correctly write command inside commands (ssh)?如何在命令(ssh)中正确编写命令?
【发布时间】:2015-06-17 22:32:45
【问题描述】:

这是我的有效命令

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

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 '…' 符号?为什么不只是timeout …?对bash -c '…' 使用单引号会使处理变得非常复杂。您需要在要执行的命令周围加上一层单引号。
  • 您将两者结合起来的代码对我有用。 “它不起作用”是什么意思?
  • @Arkanosis:组合版本在本地计算机上评估$(ps …),而不是在ssh-连接到的主机上。
  • 非常感谢!关于 -c 是因为我通常在一个字符串中发送许多命令( command1 && command 2 )
  • @JonathanLeffler:哦,没错!谢谢。

标签: bash ssh


【解决方案1】:

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

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

【讨论】:

  • 非常感谢您的解决方案,并解释了为什么我所做的没有用!!
【解决方案2】:

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

【讨论】:

  • 非常感谢!! -c 是从字符串中读取命令(因为通常我用 && 发送了很多命令)
  • 实际上在我的系统中它不起作用,它没有 pkill 所以我真的必须使用 kill 命令(有限的 bash)
猜你喜欢
  • 2015-11-11
  • 1970-01-01
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 2013-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多