Jeśli uruchomię polecenie.
sudo some-command && some-other-command
Czy drugie polecenie jest również uruchamiane z sudo
previlege?
Jeśli uruchomię polecenie.
sudo some-command && some-other-command
Czy drugie polecenie jest również uruchamiane z sudo
previlege?
Odpowiedzi:
TL; DR: NIE
Pierwsze polecenie to
sudo some-command
Drugie polecenie to
some-other-command
Polecenie sudo
przyjmuje 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 sudo
nie 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 whoami
nie 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
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
$ sudo -s -- whoami && whoami
dajeroot
username
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 ..
.
sudo bash <<"EOF"
! Dzięki! :-)
Nie, musisz napisać sudo dwa razy lub zrobić coś takiego
sudo bash -c 'foo && bar'
&&
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 sudo
uprawnieniami.
Pozwoli ci to wyjaśnić:
$ sudo whoami && whoami
root
foobar
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.
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.
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 sudo
i chociaż możemy stwierdzić, że && nie zastępuje drugiejsudo
whoami
przykład.