Wenn ich am Anfang eines Einzeilers "sudo" eingebe, gilt dies für den Rest der Befehle?

10

Wenn ich sudoam 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
Mike B.
quelle

Antworten:

11

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.

Beispiel 1

$ sudo whoami > file1 | whoami > file2 | whoami > file3

Wenn Sie catdiese Dateien verwenden, werden die folgenden Benutzernamen angezeigt:

$ cat file{1..3}
root
saml
saml

Beispiel 2

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

Beispiel 3

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.

Obskure Möglichkeiten, Sudo zu nennen

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 !

Weg Nr. 1

$ 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.

Weg # 2

$ 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.

Weg # 3

# 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.

slm
quelle
6

Nein, in Ihrem Beispiel wird nur von fooausgefü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'
Jordanm
quelle