Wird bei Verwendung von && und sudo im ersten Befehl der zweite Befehl auch als sudo ausgeführt?


64

Wenn ich einen Befehl ausführe.

sudo some-command && some-other-command

Wird der zweite Befehl ebenfalls mit sudoVorrang ausgeführt?

Antworten:


110

TL; DR: NEIN


Der erste Befehl lautet

sudo some-command

Der zweite Befehl lautet

some-other-command

Der Befehl sudoübernimmt den folgenden Befehl und führt ihn mit erhöhten Rechten aus. Das &&gehört jedoch nicht zu einem Befehl und wird von der Shell interpretiert, bevor der erste Befehl ausgeführt wird. Er weist bash an, zuerst den ersten Befehl und bei Erfolg den zweiten Befehl auszuführen.

Also die sudowissen nichts über die && some-other command. Wenn der Prozess mit erhöhten Rechten beendet wird, nimmt bash seinen Rückgabewert und führt dann den anderen Befehl aus, der wiederum den ersten nicht kennt.

Dies kann leicht demonstriert werden:

$ sudo whoami && whoami
root
username

Um das zu erreichen, was Sie wollen, können Sie eine erhöhte Bash starten und beide Befehle ausführen lassen:

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

Beide Befehle werden nun als root ausgeführt, da der gesamte oben beschriebene Prozess in einem erhöhten Prozess ausgeführt wird, dh die mit diesem Befehl gestartete Bash-Sitzung wird sofort nach Beendigung beendet. Trotzdem whoamiwissen die beiden nichts voneinander.

Dies ist nicht zweckdienlich, aber für diese Demonstration ist es einfacher, dies einfach zu tun

sudo some-command && sudo some-other-command

29
+1 für das whoamiBeispiel.
Carl H


Diese Demonstration ist wirklich cool! Muss dran denken, wenn ich das nächste Mal versuche, anderen Sudo beizubringen!
Fragmentierung erforderlich

20

Einige Beispiele dafür sind:

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

oder wenn Sie Befehle zum Verschachteln wünschen, können Sie sogar Folgendes tun:

sudo bash <<"EOF"
some-command
some-other-command
sudo bash <<"EOF2"
    some-command2
    some-other-command2
EOF2
EOF
  • Die zweite verwendet eine andere Shell.
  • Beachten Sie, dass Sie bei Verwendung von 'oder "in der 2. Version die in den Befehlen oder Parametern dieses Befehls (z. B. \' oder \") enthaltenen Zeichen maskieren müssen, damit die Komplexität sehr schnell zunimmt.

Dritte Methode funktioniert nicht: $ sudo -s -- whoami && whoamigibtroot username
BartekChom

@ BartekChom Entschuldigung, ich habe die Zitate dazu verpasst
Rinzwind 10.06.15

sudo -s -- "whoami && whoami"scheint Befehl nicht gefunden zu geben, mehr oder weniger das gleiche wie Befehl "whoami && whoami". Wie benutze ich diese Konstruktion mit &&? Ich sehe, das sudo -s cd ..gibt keinen Fehler im Gegensatz zu sudo cd ...
BartekChom,

Ich habe heute etwas Neues gelernt: sudo bash <<"EOF"! Vielen Dank! :-)
Fabby

4

Nein, Sie müssen entweder zweimal sudo schreiben oder so etwas tun

sudo bash -c 'foo && bar'

2

&&bedeutet, dass der rechtsseitige (zweite) Befehl nur ausgeführt wird, wenn der nichtsseitige (erste) Befehl erfolgreich ist, dh der Beendigungscode $?lautet 0.

Die beiden Befehle unterscheiden sich voneinander und werden in ihren eigenen Umgebungen ausgeführt, sodass der zweite Befehl nicht mit sudoBerechtigungen ausgeführt wird.

Dies wird Ihnen klar machen:

$ sudo whoami && whoami 
root
foobar

1

NEIN, und das Folgende wurde einmal sehr häufig mit Makros beschrieben.

sudo reboot && exit

Fast jeder hätte das mindestens einmal tun sollen

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

Somit ist es eine großartige "Mickey Mouse" Interviewfrage.

Dies ist so einfach zu testen, dass die Frage möglicherweise auf eine stat-padding-Übung zurückzuführen ist.


0

Auf der Kommandozeile, wenn Sie sehen

$ command one && command two

Die typische Absicht ist, den Befehl, der auf && folgt, nur dann auszuführen, wenn der erste Befehl erfolgreich ist.

Läuft der andere Befehl auch als sudo?

Absolut nein, dies entspricht nur dem Schreiben von zwei aufeinanderfolgenden Befehlen. && verleiht einem Befehl kein zusätzliches Privileg. Es ist nur ein Trenner .

Um dies zu beweisen, nehmen wir ein Beispiel.

touch fileA fileB 

Ich habe zwei Dateien fileA und fileB erstellt. Jetzt führe ich den Befehl aus

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

Ich ändere den Benutzer- und Gruppeneigentümer dieser Dateien in Benutzer- und Gruppennamentest. Jetzt sollte der erste Befehl ausgeführt werden, während der andere ausgeführt wird.

Die Ausgabe ist:

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

Daher wurde der Befehl nicht ausgeführt, da er benötigt wird, sudound obwohl wir daraus schließen können, dass && kein Ersatz für den zweiten istsudo

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.