Uruchamianie wielu poleceń z su w Bash


10

Chciałbym użyć su -cdo uruchomienia jako root wielu poleceń łącznie. Nie chcę do tego używać dodatkowego skryptu.

Próbowałem następujące:

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

ale wykonuje tylko lsnie pierwszy.

Próbowałem następujące:

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

ale mówi, że występuje błąd średnika ;.

Czy wiesz jak to zrobić?

Odpowiedzi:


14

To polecenie działa poprawnie:

su root -c "date; ls -lh"

Ale w tym poleceniu:

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

Skoro masz &przed ;więc jesteś coraz błędów. Spróbuj usunąć &i ponownie wykonać polecenie.

Lub możesz uruchomić swoje polecenie w następujący sposób:

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

Oczywiście, nie ma powodu, aby dodać nawiasy chyba że OP naprawdę naprawdę naprawdę chce wpisać ;między tcpdumpi lspoleceń - po prostu pominąć średników i będzie działać.
G-Man mówi „Przywróć Monikę”

2

Jak mówi Anubhava , twój

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

Polecenie zawodzi, ponieważ nie wolno nam nie &następuje natychmiast ;. Możesz to zobaczyć po prostu wpisując polecenia bezpośrednio w powłoce:

  • true & true  Pracuje
  • true & ; true nie działa

Jeśli chcesz, aby tcpdumppolecenie działało w tle, usuń ;, jak w

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

(i ;na końcu też nie potrzebujesz , ale to nie boli).


1

Myślę, że nohuppolecenie dostarczy ci również tego, czego chcesz ... tcpdump działa w tle (nie wymaga znaku handlowego i):

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

Cześć, tak myślę. NOHUP pozostawia polecenia działające w tle, nawet gdy użytkownik się rozłączy. Nie pamiętam tego. Wielkie dzięki.

(1) Dobrze jest używać, nohupgdy uruchamiasz polecenia w tle, ale tak naprawdę nie ma to nic wspólnego z tym pytaniem. (2) Ta odpowiedź jest błędna - nohupsama w sobie nie powoduje uruchomienia polecenia w tle; wciąż musisz wpisać &(co pozostawia nas z powrotem w miejscu, w którym zaczęliśmy, z błędem składni w poleceniu).
G-Man mówi „Przywróć Monikę”

0

Aby dodać do doskonałej odpowiedzi Anubhavy :

Możesz również użyć {}takiego:

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

{}jest nieco bardziej wydajny niż ()w tym, że nie tworzy sub-powłoki. {}nie potrzebują miejsca po {oraz ;przed }chyba mamy &już.


Oczywiście, nie ma powodu, aby dodać nawiasy klamrowe lub w ogóle, chyba że użytkownik naprawdę naprawdę naprawdę chce wpisać ;między tcpdumpi lspoleceń - wystarczy opuścić średnik i będzie działać.
G-Man mówi „Przywróć Monikę”

-1

Użyj, &&aby oddzielić swoje polecenia w następujący sposób:

$ su -c "ls && ls"

Aaa .. to mój błąd. Chciałem uruchomić ten proces w tle, ale nie wiedziałem o tym && dla oddzielnych poleceń. Thx

3
&& oznacza „Wykonaj drugie polecenie tylko wtedy, gdy pierwsze się powiedzie”. Jeśli pierwsze polecenie się nie powiedzie, drugie nie uruchomi się. Zazwyczaj jest to dobre, ale wahałbym się opisać && jako czysto separator.
Leo

A jeśli chcesz uruchomić tcpdumpproces w tle, &&czy nie ma to w ogóle nic dobrego.
G-Man mówi „Przywróć Monikę”
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.