Ejecutar múltiples comandos con su en Bash

10

Me gustaría usar su -cpara ejecutar como root múltiples comandos por completo. No quiero usar un script adicional para esto.

Intenté lo siguiente:

su root -c "tcpdump -i wlan0 -s 1500 -w CCCCCC & " -c "ls -lh"

pero ejecuta solo el lsno el primero.

Intenté lo siguiente:

su root -c "tcpdump -i wlan0 -s 1500 -w CCCCCC & ; ls -lh;"

pero dice que hay un error con el punto ;y coma .

¿Sabes como hacer esto?

Abruzzo Forte e Gentile
fuente

Respuestas:

14

Este comando funciona bien:

su root -c "date; ls -lh"

Pero en este comando:

su root -c "tcpdump -i wlan0 -s 1500 -w CCCCCC & ; ls -lh;"

Como lo has hecho &antes, ;por lo tanto, obtienes errores. Intente eliminar &y volver a ejecutar el comando.

O puede ejecutar su comando así:

su root -c "(tcpdump -i wlan0 -s 1500 -w CCCCCC &); ls -lh"
anubhava
fuente
Por supuesto, no hay razón para agregar paréntesis, a menos que el OP realmente realmente realmente le gusta introducir ;entre el tcpdumpy lscomandos - acaba de dejar de lado los puntos y comas y funcionará.
G-Man dice 'reinstalar a Monica'
2

Como dice anubhava , tu

su root -c "tcpdump -i wlan0 -s 1500 -w CCCCCC & ; ls -lh;"

el comando falla porque no se le permite haber &seguido de inmediato ;. Puede ver esto simplemente escribiendo los comandos directamente en el shell:

  • true & true  trabajos
  • true & ; true no funciona

Si desea que el tcpdumpcomando se ejecute en segundo plano, elimine el ;, como en

su root -c "tcpdump -i wlan0 -s 1500 -w CCCCCC & ls -lh;"

(y tampoco necesitas el ;al final, pero no duele).

G-Man dice 'restablecer a Mónica'
fuente
1

Creo que el nohupcomando también te dará lo que quieres ... tcpdump ejecutándose en segundo plano (no es necesario utilizar ampersand):

su root -c "nohup tcpdump -i wlan0 -s 1500 -w CCCCCC ; ls -lh"

fuente
Hola creo que si NOHUP deja los comandos ejecutándose en segundo plano incluso cuando un usuario se desconecta. No me acuerdo de eso. Muchas gracias.
(1) Es bueno usarlo nohupcuando ejecuta comandos en segundo plano, pero eso realmente no tiene nada que ver con esta pregunta. (2) Esta respuesta es incorrecta: nohuppor sí sola no hace que un comando se ejecute en segundo plano; todavía tiene que escribir &(lo que nos deja atrás donde comenzamos, con un error de sintaxis en el comando).
G-Man dice 'Reincorporar a Monica'
0

Solo para agregar a la excelente respuesta de Anubhava :

También podría usarlo {}así:

su root -c "{ tcpdump -i wlan0 -s 1500 -w CCCCCC & }; ls -lh"

{}es un poco más eficiente ()que porque no crea un sub shell. {}necesita un espacio después {y un ;antes a }menos que &ya tengamos un espacio .

codeforester
fuente
Por supuesto, no hay ninguna razón para agregar llaves o paréntesis a menos que el usuario realmente realmente quiera escribir un ;entre los comandos tcpdumpy ls, simplemente omita el punto y coma y funcionará.
G-Man dice 'Reincorporar a Monica'
-1

Use &&para separar sus comandos así:

$ su -c "ls && ls"

fuente
Auch ... ese es mi error. Quería ejecutar el proceso en segundo plano, pero no estaba al tanto de esto && para separar los comandos. Thx
3
&& significa "Ejecutar solo el segundo comando si el primero tuvo éxito". Si su primer comando falla, el segundo no se ejecutará. Esto suele ser bueno, pero dudaría en describir && como puramente un separador.
Leo
Y, si desea ejecutar el tcpdumpproceso en segundo plano, &&no sirve de nada.
G-Man dice 'reinstalar a Monica'