Exécuter plusieurs commandes avec su dans Bash

10

Je voudrais utiliser su -cpour exécuter en tant que root plusieurs commandes. Je ne veux pas utiliser de script supplémentaire pour cela.

J'ai essayé ce qui suit:

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

mais il exécute seulement le lspas le premier.

J'ai essayé ce qui suit:

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

mais il indique qu'il y a une erreur avec le point-virgule ;.

Savez-vous comment le faire?

Abruzzo Forte e Gentile
la source

Réponses:

14

Cette commande fonctionne correctement:

su root -c "date; ls -lh"

Mais dans cette commande:

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

Comme vous l'avez &déjà, ;vous obtenez des erreurs. Essayez de supprimer &et de réexécuter la commande.

Ou vous pouvez exécuter votre commande comme ceci:

su root -c "(tcpdump -i wlan0 -s 1500 -w CCCCCC &); ls -lh"
anubhava
la source
Bien sûr, il n'y a aucune raison d'ajouter des parenthèses à moins que l'OP ne veuille vraiment vraiment taper un ;entre les commandes tcpdumpet ls- laissez simplement les points-virgules et cela fonctionnera.
G-Man dit `` Réintègre Monica '' le
2

Comme le dit anubhava , votre

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

échoue car vous n'êtes pas autorisé à avoir &suivi immédiatement ;. Vous pouvez le voir simplement en tapant les commandes directement dans le shell:

  • true & true  travaux
  • true & ; true ne fonctionne pas

Si vous souhaitez que la tcpdumpcommande s'exécute en arrière-plan, supprimez le ;, comme dans

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

(et vous n'avez pas besoin du ;à la fin non plus, mais ça ne fait pas mal).

G-Man dit «Réintègre Monica»
la source
1

Je pense que la nohupcommande vous donnera ce que vous voulez aussi ... tcpdump fonctionnant en arrière-plan (pas de perluète nécessaire):

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

la source
Salut, je pense que oui. NOHUP laisse les commandes s'exécuter en arrière-plan même lorsqu'un utilisateur se déconnecte. Je ne m'en souvenais pas. Merci beaucoup.
(1) Il est bon d'utiliser nohuplorsque vous exécutez des commandes en arrière-plan, mais cela n'a vraiment rien à voir avec cette question. (2) Cette réponse est erronée - nohupen elle-même ne provoque pas l'exécution d'une commande en arrière-plan; vous devez encore taper &(ce qui nous laisse là où nous avons commencé, avec une erreur de syntaxe dans la commande).
G-Man dit `` Réintègre Monica '' le
0

Pour ajouter à l'excellente réponse d'Anubhava :

Vous pouvez également utiliser {}, comme ceci:

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

{}est un peu plus efficace que ()dans la mesure où il ne crée pas de sous-shell. {}a besoin d'un espace après {et ;avant, }sauf si nous en avons &déjà un .

forestier
la source
Bien sûr, il n'y a aucune raison d'ajouter des accolades ou des parenthèses à moins que l'utilisateur ne veuille vraiment vraiment taper un ;entre les commandes tcpdumpet ls- laissez simplement le point-virgule et cela fonctionnera.
G-Man dit `` Réintègre Monica '' le
-1

Utilisez &&pour séparer vos commandes comme ceci:

$ su -c "ls && ls"

la source
Auch..c'est mon erreur. Je voulais exécuter le processus en arrière-plan mais je n'étais pas au courant de cela && pour séparer les commandes. Thx
3
&& signifie "N'exécuter la deuxième commande que si la première a réussi". Si votre première commande échoue, la seconde ne s'exécutera pas. C'est généralement bon, mais j'hésiterais à décrire && comme un pur séparateur.
Leo
Et, si vous voulez exécuter le tcpdumpprocessus en arrière-plan, cela &&ne vous sert à rien.
G-Man dit `` Réintègre Monica '' le