Czy w przypadku pierwszego polecenia && i sudo drugie polecenie jest również uruchamiane jako sudo?

64

Jeśli uruchomię polecenie.

sudo some-command && some-other-command

Czy drugie polecenie jest również uruchamiane z sudoprevilege?

użytkownik974407
źródło

Odpowiedzi:

110

TL; DR: NIE


Pierwsze polecenie to

sudo some-command

Drugie polecenie to

some-other-command

Polecenie sudoprzyjmuje następujące polecenie i wykonuje je z podwyższonymi uprawnieniami. &&Jednak nie należą do polecenia i jest interpretowany przez powłokę, przed wykonaniem pierwszego polecenia. Mówi bashowi, aby najpierw wykonał pierwsze polecenie, a po sukcesie drugie.

Więc sudonie wie o && some-other command. Po zakończeniu podwyższonego procesu bash pobiera wartość zwracaną, a następnie wykonuje inne polecenie, które ponownie nie wie o pierwszym.

Można to łatwo wykazać:

$ sudo whoami && whoami
root
username

Aby osiągnąć to, co chcesz, możesz uruchomić podwyższone bash i pozwolić mu na wykonanie obu poleceń:

$ sudo bash -c 'whoami && whoami'
root
root

Tak więc teraz oba polecenia są wykonywane jako root, ponieważ cały proces opisany powyżej jest wykonywany w podwyższonym procesie, tj. Sesja bash rozpoczęła się od tego polecenia, które natychmiast kończy się po zakończeniu. Mimo to obaj whoaminie znają się nawzajem.

Nie odpowiada to żadnemu celowi, ale dla tej demonstracji łatwiej jest po prostu to zrobić

sudo some-command && sudo some-other-command
s3lph
źródło
29
+1 na whoamiprzykład.
Carl H
Udostępniono na Twitterze: twitter.com/StackExchange/status/609076664795033600
Tim
Ta demonstracja jest naprawdę fajna! Muszę o tym pomyśleć, kiedy następnym razem będziesz uczył sudo innych!
Fragmentacja potrzebna
20

Nie. Oto niektóre przykłady:

sudo some-command && sudo some-other-command 
sudo sh -c "some-command && some-other-command"

lub jeśli chcesz polecenia zagnieżdżenia, możesz nawet:

sudo bash <<"EOF"
some-command
some-other-command
sudo bash <<"EOF2"
    some-command2
    some-other-command2
EOF2
EOF
  • Drugi używa innej powłoki.
  • Pamiętaj, że kiedy używasz „lub” w 2. wersji, musisz uciec przed tymi w poleceniach lub parametrach tego polecenia (np. \ 'Lub \ ”), aby bardzo szybko się skomplikować.
Rinzwind
źródło
Trzecia metoda nie działa: $ sudo -s -- whoami && whoamidajeroot username
BartekChom
@BartekChom przepraszam, że przegapiłem cytaty na ten temat
Rinzwind
sudo -s -- "whoami && whoami"wydaje się, że polecenie nie zostało znalezione, mniej więcej tak samo jak polecenie "whoami && whoami". Jak korzystać z tej konstrukcji razem z &&? Widzę, że sudo -s cd ..nie daje to żadnego błędu w przeciwieństwie do sudo cd ...
BartekChom
Nauczyłem się czegoś nowego dzisiaj: sudo bash <<"EOF"! Dzięki! :-)
Fabby,
4

Nie, musisz napisać sudo dwa razy lub zrobić coś takiego

sudo bash -c 'foo && bar'
davidbaumann
źródło
2

&&oznacza, że ​​prawostronne (drugie) polecenie będzie działało tylko wtedy, gdy ostatnie (pierwsze) polecenie jest skuteczne, tj. kod zakończenia $?to 0.

Oba polecenia różnią się od siebie i będą działać we własnym środowisku, więc drugie polecenie nie będzie działać z sudouprawnieniami.

Pozwoli ci to wyjaśnić:

$ sudo whoami && whoami 
root
foobar
heemayl
źródło
1

NIE, a następujące elementy były kiedyś bardzo często makro.

sudo reboot && exit

Prawie każdy powinien to zrobić przynajmniej raz

sudo apt-get update && sudo apt-get upgrade

Jest to więc świetne pytanie do wywiadu z „myszką miki”.

Jest to tak łatwo przetestowane, że można podejrzewać pytanie o wypełnianie statystyk.

mckenzm
źródło
0

W wierszu polecenia, gdy zobaczysz

$ command one && command two

typowym celem jest wykonanie polecenia następującego po && tylko wtedy, gdy pierwsze polecenie zakończy się powodzeniem.

Czy to drugie polecenie działa również jako sudo?

absolutnie nie, to tak jak pisanie dwóch kolejnych poleceń, to && nie daje żadnego dodatkowego uprawnienia do polecenia. To tylko separator .

Aby to udowodnić, weźmy przykład.

touch fileA fileB 

Utworzyłem dwa pliki: plik A i plik B. Teraz uruchomię polecenie

sudo chown test:test fileA && chown test:test fileB

Zmieniam użytkownika i właściciela grupy tych plików na test nazwy użytkownika i grupy. Teraz pierwsze polecenie powinno zostać uruchomione, a co z drugim?

Dane wyjściowe to:

chown: changing ownership of `fileB': Operation not permitted

Komenda nie została uruchomiona, ponieważ jest potrzebna sudoi chociaż możemy stwierdzić, że && nie zastępuje drugiejsudo

Maythux
źródło