Antworten:
Um sich selbst davon zu überzeugen, dass sudonur 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 catdiese 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 catdiese 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 foo1würde sudo foo2. Anhand meiner whoamiBeispiele 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 sudoStart durch.
$ sudo tee /proc/sys/vm/drop_caches <<<1
Wie es funktioniert?
Diese Methode führt das teeProgramm als root AND aus und nimmt Eingaben von einer here-Zeichenfolge entgegen, die vor dem sudoAufrufen des teeBefehls 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 -sSchalter verwenden, sudowird 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 -sSwitch jedoch an, dass ein einzelner Befehl an die Shell übergeben wird, die im Eintrag der /etc/passwdDatei 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.