Ausführen mehrerer Befehle mit su in Bash

10

Ich möchte verwenden su -c, um als Root mehrere Befehle insgesamt auszuführen. Ich möchte dafür kein zusätzliches Skript verwenden.

Ich habe folgendes versucht:

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

aber es führt nur das lsnicht das erste aus.

Ich habe folgendes versucht:

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

aber es heißt, dass es einen Fehler mit dem Semikolon gibt ;.

Weißt du wie das geht?

Abruzzen Forte e Gentile
quelle

Antworten:

14

Dieser Befehl läuft einwandfrei:

su root -c "date; ls -lh"

Aber in diesem Befehl:

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

Da Sie &vorher haben, erhalten Sie ;daher Fehler. Versuchen Sie, &den Befehl zu entfernen und erneut auszuführen.

Oder Sie können Ihren Befehl folgendermaßen ausführen:

su root -c "(tcpdump -i wlan0 -s 1500 -w CCCCCC &); ls -lh"
Anubhava
quelle
Natürlich gibt es keinen Grund, Klammern hinzuzufügen, es sei denn, das OP möchte wirklich wirklich wirklich einen ;zwischen den Befehlen tcpdumpund lseingeben - lassen Sie einfach die Semikolons weg und es wird funktionieren.
G-Man sagt "Reinstate Monica"
2

Wie Anubhava sagt , dein

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

Befehl schlägt fehl, weil Sie nicht &sofort gefolgt sein dürfen ;. Sie können dies sehen, indem Sie die Befehle direkt in die Shell eingeben:

  • true & true  funktioniert
  • true & ; true funktioniert nicht

Wenn der tcpdumpBefehl im Hintergrund ausgeführt werden soll, entfernen Sie den Befehl ;wie in

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

(und das brauchst du ;am Ende auch nicht, aber es tut nicht weh).

G-Man sagt "Reinstate Monica"
quelle
1

Ich denke, der nohupBefehl bringt Ihnen auch das, was Sie wollen ... tcpdump läuft im Hintergrund (kein kaufmännisches Und erforderlich):

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

quelle
Hallo, ich denke schon. NOHUP lässt Befehle im Hintergrund laufen, auch wenn ein Benutzer die Verbindung trennt. Daran habe ich mich nicht erinnert. Danke vielmals.
(1) Es ist gut zu verwenden, nohupwenn Sie Befehle im Hintergrund ausführen, aber das hat wirklich nichts mit dieser Frage zu tun. (2) Diese Antwort ist falsch - nohupallein führt nicht dazu, dass ein Befehl im Hintergrund ausgeführt wird. Sie müssen noch eingeben &(was uns zurücklässt, wo wir begonnen haben, mit einem Syntaxfehler im Befehl).
G-Man sagt "Reinstate Monica"
0

Nur um Anubhavas ausgezeichnete Antwort zu ergänzen :

Sie könnten auch so verwenden {}:

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

{}ist etwas effizienter als dadurch, ()dass keine Sub-Shell erstellt wird. {}braucht ein Leerzeichen nach {und ein ;vor, es }sei denn, wir haben &bereits ein.

Codeforester
quelle
Natürlich gibt es keinen Grund, Klammern oder Klammern hinzuzufügen, es sei denn, der Benutzer möchte wirklich wirklich wirklich einen ;zwischen den Befehlen tcpdumpund lseingeben - lassen Sie einfach das Semikolon weg und es wird funktionieren.
G-Man sagt "Reinstate Monica"
-1

Verwenden &&Sie diese Option, um Ihre Befehle wie folgt zu trennen:

$ su -c "ls && ls"

quelle
Auch ... das ist mein Fehler. Ich wollte den Prozess im Hintergrund ausführen, war mir jedoch nicht bewusst, dass Befehle getrennt werden sollten. Thx
3
&& bedeutet "Führen Sie den zweiten Befehl nur aus, wenn der erste erfolgreich war". Wenn Ihr erster Befehl fehlschlägt, wird der zweite nicht ausgeführt. Dies ist normalerweise gut, aber ich würde zögern, && als reines Trennzeichen zu bezeichnen.
Leons
Und wenn Sie den tcpdumpProzess im Hintergrund ausführen möchten , &&nützt Ihnen das überhaupt nichts.
G-Man sagt "Reinstate Monica"