Wenn ich sudo
am Anfang eines Einzeilers in Bash tippe, gilt dies für den Rest der Befehle?
Mit anderen Worten, ist dies:
sudo foo | foo2 | foo3
äquivalent dazu:
sudo foo | sudo foo2 | sudo foo3
Um sich selbst davon zu überzeugen, dass sudo
nur der erste Befehl ausgeführt wird, der bereitgestellt wurde, und alles andere, nachdem die erste Pipe als Ihre ursprüngliche Benutzer-ID ausgeführt wurde, können Sie diese nutzlose Befehlskette verwenden, um sie anzuzeigen.
$ sudo whoami > file1 | whoami > file2 | whoami > file3
Wenn Sie cat
diese Dateien verwenden, werden die folgenden Benutzernamen angezeigt:
$ cat file{1..3}
root
saml
saml
Wenn Sie jedoch eine Subshell ausführen:
$ sudo sh -c 'whoami > file4 | whoami > file5 | whoami > file6'
Wenn Sie cat
diese Dateien verwenden, werden die folgenden Benutzernamen angezeigt:
$ cat file{4..6}
root
root
root
Ihr Kommentar zu sudo foo1 | sudo foo2 ...
würde niemals funktionieren, da die Ausgabe von an weitergeleitet sudo foo1
würde sudo foo2
. Anhand meiner whoami
Beispiele zeigt dies, dass diese Befehlskette nichts bewirkt.
$ sudo whoami | sudo whoami | sudo whoami
root
Der erste lief, aber der zweite und dritte machen nichts, da sie nicht für Eingaben gerüstet sind. Ich denke eher, Sie wollten so etwas schreiben:
$ sudo whoami;sudo whoami;sudo whoami
root
root
root
Dies entspricht einer dreimaligen Ausführung mit drei verschiedenen Eingabeaufforderungen. Oder dieses:
$ sudo whoami && sudo whoami && sudo whoami
root
root
root
Aber mach niemals den letzten. Es gehört in den nächsten Abschnitt.
Dies ist nicht meine beste Arbeit, aber es gibt auch andere Möglichkeiten, wie ich mehrere Befehle mit ausgeführt habe sudo
. Ich zeige sie hier nur, um nicht zu lehren , damit andere sie unbedingt tun !
$ echo "echo 1 > /proc/sys/vm/drop_caches" | sudo sh
Wie es funktioniert?
Das Echo-Programm in den doppelten Anführungszeichen wird aufgrund von sudo als root ausgeführt, aber die Shell, die die Ausgabe von echo in die Nur-root-Datei umleitet, wird weiterhin wie Sie ausgeführt. Ihre aktuelle Shell führt die Umleitung vor dem sudo
Start durch.
$ sudo tee /proc/sys/vm/drop_caches <<<1
Wie es funktioniert?
Diese Methode führt das tee
Programm als root AND aus und nimmt Eingaben von einer here-Zeichenfolge entgegen, die vor dem sudo
Aufrufen des tee
Befehls ausgeführt wird.
# this way
$ sudo -s -- 'whoami'
# or this way
sudo -s -- sh -c 'whoami;whoami'
Wie es funktioniert?
Diese mögen anders aussehen, aber sie machen wirklich das Gleiche. Wenn Sie den -s
Schalter verwenden, sudo
wird ein einzelner Befehl ausgeführt. Ich konnte nie herausfinden, ob es einen Weg gab, ihm zu entkommen. Nichts davon würde funktionieren.
# this
$ sudo -s -- 'whoami;whoami'
# or this
$ sudo -s -- 'whoami\;whoami'
Beim Betrachten der Manpage gibt der -s
Switch jedoch an, dass ein einzelner Befehl an die Shell übergeben wird, die im Eintrag der /etc/passwd
Datei durch den Benutzer definiert ist . Also verwenden wir einen Trick in der zweiten Form, der hauptsächlich die Shell übergibt, eine andere Shell ( sh -c
), in der wir unsere Befehlsfolge zum Ausführen "hintertüren".
Es gibt noch mehr, aber ich werde hier aufhören. Diese sollen Ihnen nur zeigen, was Sie tun können, wenn Sie die Dinge verstehen, sollten aber nicht unbedingt nur Junk miteinander verketten, weil Sie dies können. Sie sollten versuchen, Ihre Code-Pragmas auf einer logischen Ebene zu halten, die sinnvoll ist, damit andere sie verstehen und unterstützen können sie in der Zukunft.
Nein, in Ihrem Beispiel wird nur von foo
ausgeführt sudo
. Wenn Sie alle Befehle mit eskalierten Berechtigungen ausführen möchten, können Sie eine Shell erzeugen:
sudo sh -c 'foo | foo2 | foo3'