Esecuzione di più comandi con su in Bash


10

Vorrei usare su -cper eseguire come root più comandi del tutto. Non voglio usare uno script aggiuntivo per questo.

Ho provato quanto segue:

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

ma esegue solo il lsnon primo.

Ho provato quanto segue:

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

ma dice che c'è un errore con il punto e virgola ;.

Sai come farlo?

Risposte:


14

Questo comando funziona bene:

su root -c "date; ls -lh"

Ma in questo comando:

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

Dato che hai &prima ;quindi stai ricevendo errori. Prova a rimuovere &e rieseguire il comando.

Oppure puoi eseguire il tuo comando in questo modo:

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

Naturalmente, non c'è motivo di aggiungere parentesi a meno che l'OP non voglia davvero davvero digitare un comando ;tra i comandi tcpdumpe ls- basta tralasciare i punti e virgola e funzionerà.
G-Man dice "Ripristina Monica" il

2

Come dice anubhava , il tuo

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

il comando non riesce perché non ti è stato permesso di &seguirlo immediatamente ;. Puoi vederlo semplicemente digitando i comandi direttamente nella shell:

  • true & true  lavori
  • true & ; true non funziona

Se si desidera tcpdumpeseguire il comando in background, rimuovere ;, come in

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

(e ;alla fine non ti serve nemmeno, ma non fa male).


1

Penso che il nohupcomando ti porterà anche quello che vuoi ... tcpdump in esecuzione in background (non è necessaria la e commerciale):

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

Ciao, penso di si. NOHUP lascia i comandi in esecuzione in background anche quando un utente si disconnette. Non me lo ricordavo. Molte grazie.

(1) È utile utilizzarlo nohupquando si eseguono comandi in background, ma ciò non ha nulla a che fare con questa domanda. (2) Questa risposta è sbagliata: di nohupper sé non causa l'esecuzione di un comando in background; devi ancora digitare &(che ci lascia indietro da dove siamo partiti, con un errore di sintassi nel comando).
G-Man dice "Ripristina Monica" il

0

Solo per aggiungere all'eccellente risposta di Anubhava :

Puoi anche usare {}, in questo modo:

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

{}è un po 'più efficiente rispetto ()al fatto che non crea una sub shell. {}ha bisogno di uno spazio dopo {e un ;prima a }meno che non ne abbiamo &già uno .


Naturalmente, non c'è motivo di aggiungere parentesi graffe o parentesi a meno che l'utente non voglia davvero davvero digitare un comando ;tra i comandi tcpdumpe ls- basta tralasciare il punto e virgola e funzionerà.
G-Man dice "Ripristina Monica" il

-1

Utilizzare &&per separare i comandi in questo modo:

$ su -c "ls && ls"

Auch..questo è il mio errore. Volevo eseguire il processo in background ma non ero a conoscenza di questo && per separare i comandi. Thx

3
&& significa "Esegui il secondo comando solo se il primo è riuscito". Se il tuo primo comando si interrompe, il secondo non verrà eseguito. Questo di solito è buono, ma esiterei a descrivere && come un semplice separatore.
Leone,

E, se vuoi eseguire il tcpdumpprocesso in background, &&non ti va affatto bene.
G-Man dice "Ripristina Monica" il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.