El comportamiento del comando es diferente cuando lo ejecuta otro usuario (a través de su -c)

El comportamiento del comando es diferente cuando lo ejecuta otro usuario (a través de su -c)

Quiero eliminar todos los procesos que coincidan con una cadena específica. Aquí está mi script, que funciona bastante bien:

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

Ahora quiero ejecutar este script desde otro usuario mediante `su -c:

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

Mi problema es que cuando grep verySpecificChaincoincide con varios procesos, solo se pasa el primer elemento a 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

Realmente me gustaría entender por qué con o sin su -cel comando cambia el comportamiento.

Estoy ejecutando GNU bash, versión 4.2.53(1) (x86_64-redhat-linux-gnu) en Fedora 20.

Respuesta1

Justopkill -f verySpecificChain

Respuesta2

No puedo explicar qué falla exactamente en su ejemplo (Así que admito que es algún tipo de programación vudú de mi parte.), pero esta es una solución que (casi - ver más abajo*) funciona en mi bash (Debian):

  • deshacerse del interior echo;
  • escapar $2.

Resultado:

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

*Escribí "casi funciona" porque Debian no me permite usar suuna tubería para repetir la contraseña. Debo ejecutarlo sin inicial echoy escribir la contraseña de forma interactiva. Supongo que no es un problema en Fedora de OP.

información relacionada