2012-12-02 12 views
6

Ich möchte Bash Prozess Ersetzung für einen Sudo-Befehl verwenden.Verwenden Bash Prozess Ersetzung für einen Sudo-Befehl

Zum Beispiel, hier ist ein nicht-sudo-Befehl, der für mich funktioniert:

$ cat <(echo "installed.txt") 
installed.txt 

Und hier ist ein sudo Version des Befehls, das nicht funktioniert:

$ sudo cat <(echo "installed.txt") 
cat: /dev/fd/63: Bad file descriptor 

Lesen der sudo Manpage scheint es, dass sudo alle außer den stdin/stdout/stderr Dateideskriptoren schließt, bevor der Befehl als root ausgeführt wird. Das führt mich zu der Annahme, dass bash den Deskriptor erstellt (und die Prozesssubstitution ausführt), bevor er den Befehl sudo ausführt.

Ich änderte die root-Shell in bash (anstelle von sh default). Ich habe getestet, dass der Befehl funktioniert, wenn Sie als root angemeldet sind. Es funktioniert nur nicht mit einem sudo-Befehl.

Was ist die geeignete Technik, um das zu erreichen, was ich hier versuche? Eval, Zitat, Sudo Flagge, Sudoers Datei Mod, andere?

Antwort

6

Versuchen Sie dies in Ihrem Shell tun:

$ sudo bash -c 'cat <(echo "installed.txt for UID=$UID")' 
installed.txt for UID=0 
0

Der beste Ansatz ist wahrscheinlich, alles in ein Skript zu schreiben und dieses Skript mit sudo auszuführen.

+0

Alles ist ein Einzeiler; Ich möchte es vermeiden, das zu tun. –

+1

@ClaytonStanley Dann verwenden Sie die Lösungen in den anderen (sehr guten) Antworten gegeben ... –

3
sudo bash -c 'cat <(echo "installed.txt")' 
+1

Dies ist die akzeptierte Antwort zu, aber es war nicht die früheste Veröffentlichung davon. –

+0

Wir haben beide verzweifelt gleichzeitig getippt! Du kannst sie nicht alle gewinnen. Mehr auf den Punkt, _I_ kann nicht alle gewinnen! – emrys57

+0

3 Minuten, um eine Zeile zu schreiben? Hä! =) –

4

Das Verhalten in der Frage beschrieben ist, um die Gestaltung von sudo fällig.

$ sudo cat <(echo "installed.txt") 
cat: /dev/fd/63: Bad file descriptor 

Der Fehler tritt auf, weil sudo ein Standardverhalten hat, die Datei-Deskriptoren, mit Ausnahme von Standard Eingang, Ausgang und Fehler geschlossen wird. Wie auf der man-Seite beschrieben:

Standardmäßig schließt sudo alle offenen Dateideskriptoren, die nicht Standardeingabe, Standardausgabe und Standardfehler sind, wenn ein Befehl ausgeführt wird.

Dieses Verhalten kann mit der -C (oder --close-from) Option außer Kraft gesetzt werden, um eine Dateideskriptors Nummer, unter den Dateien angeben sollen nicht geschlossen werden. von dieser Möglichkeit Gebrauch von einem Administrator muss jedoch erlaubt sein: die folgenden Anforderungen /etc/sudoers

Defaults closefrom_override 

Mit dem im Ort hinzugefügt werden, wird der Befehl funktioniert, wenn -C verwendet wird:

$ sudo -C64 cat <(echo "installed.txt") 
installed.txt 

(hier wurde die Nummer 64 angegeben, weil sie in der Fehlermeldung größer als die 63 war).

Verwandte Themen