由其他用户执行时命令行为不同(通过 su -c)

由其他用户执行时命令行为不同(通过 su -c)

我想杀死与特定链匹配的每个进程。这是我的脚本,效果很好:

echo `ps aux | grep verySpecificChain | grep -v grep | /usr/bin/awk '{ print $2 }'` | xargs kill

现在我想通过“su -c”从其他用户执行此脚本:

echo password | su -c "echo `ps aux | grep verySpecificChain | grep -v grep | /usr/bin/awk '{ print $2 }'` | xargs kill" userName;

我的问题是,当grep verySpecificChain匹配多个进程时,只有第一个元素被传递给xargs kill

30598  ==> killed
bash: line 1: 30599: command not found  ==> Not killed
bash: line 2: 30600: command not found  ==> Not killed
bash: line 3: 30606: command not found  ==> Not killed

我真的很想了解为什么有或没有su -c命令行为改变?

我在 Fedora 20 上运行 GNU bash,版本 4.2.53(1)-release (x86_64-redhat-linux-gnu)。

答案1

只是pkill -f verySpecificChain

答案2

我无法解释你的例子中到底失败了什么(所以我承认这是我这边的某种巫毒编程),但这是一个在我的 bash (Debian) 中有效的修复(几乎 - 见下文*):

  • 摆脱里面的echo
  • 逃脱$2

结果:

echo password | su -c "ps aux | grep verySpecificChain | grep -v grep | /usr/bin/awk '{ print \$2 }' | xargs kill" userName;

*我写了“几乎可以工作”,因为 Debian 不允许我su在管道中使用来回显密码。我必须在没有首字母的情况下运行它echo并以交互方式输入密码。我想这在 OP 的 Fedora 中不是问题。

相关内容