O comportamento do comando é diferente quando executado por outro usuário (via su -c)

O comportamento do comando é diferente quando executado por outro usuário (via su -c)

Quero eliminar todos os processos que correspondam a uma cadeia específica. Aqui está o meu script, que funciona muito bem:

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

Agora quero executar este script de outro usuário via `su -c:

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

Meu problema é que quando grep verySpecificChaincorresponde a vários processos, apenas o primeiro elemento é passado para 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

Eu realmente gostaria de entender por que com ou sem su -co comando o comportamento muda?

Estou executando o GNU bash, versão 4.2.53(1)-release (x86_64-redhat-linux-gnu) no Fedora 20.

Responder1

Apenaspkill -f verySpecificChain

Responder2

Não consigo explicar o que exatamente falha no seu exemplo (então eu admito que é algum tipo de programação vodu da minha parte), mas esta é uma correção que (quase -- veja abaixo*) funciona no meu bash (Debian):

  • livrar-se de dentro echo;
  • escapar $2.

Resultado:

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

*Eu escrevi "quase funciona" porque o Debian não me deixa usar suum pipe para repetir a senha. Devo executá-lo sem inicial echoe digitar a senha de forma interativa. Acho que não é um problema no Fedora do OP.

informação relacionada