sudo at -f

sudo at -f

Wenn ich mache:

at -f <(echo "rm $file") now + 2 hours

das klappt prima

Wenn ich jedoch Folgendes mache:

sudo at -f <(echo "rm $file") now + 2 hours

Ich bekomme:

at: /dev/fd/63: No such file or directory

Ich nehme an, das liegt an der Reihenfolge, in der die Befehle verarbeitet werden. Gibt es eine Möglichkeit, dies mit dem Befehl sudo zu umgehen? Die einzige Möglichkeit, die mir einfällt, ist, den Befehl in ein Skript einzufügen und dieses Skript mit sudo zu starten. Das ist eine Option, aber jetzt möchte ich wissen, warum das passiert.

Entschuldigen Sie, wenn dies bereits irgendwo beantwortet wurde, ich kann es einfach nicht finden, da ich nicht sicher bin, wonach ich suchen soll.

Antwort1

Denn in diesem Fall öffnet die Shell die Pipe zum Befehl in der <(...)und übergibt den Datei-Handle an den ausgeführten Child-Prozess sudo. Der Pfad /dev/fd/63ist eine vom Kernel bereitgestellte Methode, um den Zugriff auf einen bereits geöffneten Datei-Handle über einen normalen Pfadnamen zu ermöglichen.

Allerdings sudogibt es den Handle nicht an den ausgeführten Prozess weiter (aus Sicherheitsgründen): Standardmäßig schließt es alle Datei-Handles außer stdin, stdout und stderr, sodass das letztendlich ausgeführte Programm nicht über den entsprechenden Datei-Handle verfügt /dev/fd/63und ein Fehler auftritt.

Sie können das Problem lösen, indem Sie die Ersetzung in einer Shell innerhalb von sudo durchführen:

sudo bash -c 'cat <(echo something)' 

Dies bedeutet natürlich, dass die innere Ersetzung auch mit erhöhten Berechtigungen ausgeführt wird:

$ sudo bash -c 'cat <(id)'
uid=0(root) gid=0(root) groups=0(root)

Das -CFlag für sudobietet eine andere Möglichkeit, aber es bedarf möglicherweise einer zusätzlichen Konfiguration, um zugelassen zu werden:

-C Zahl, --close-from=Zahl
Schließen Sie alle Dateideskriptoren, die größer oder gleich num sind, bevor Sie einen Befehl ausführen. Werte kleiner als drei sind nicht zulässig. Standardmäßig schließt sudo beim Ausführen eines Befehls alle offenen Dateideskriptoren außer Standardeingabe, Standardausgabe und Standardfehler. Die Sicherheitsrichtlinie kann die Möglichkeit des Benutzers einschränken, diese Option zu verwenden. Die sudoers-Richtlinie erlaubt die Verwendung der Option -C nur, wenn der Administrator die Option closefrom_override aktiviert hat.

Antwort2

Ich nehme an, Sie möchten auf catalle Dateien Ihres aktuellen als Root zugreifen ls?

Es könnte sinnvoll sein, stattdessen Pipe zu verwenden xargs. Versuchen Sie es hiermit:

ls | xargs sudo cat

verwandte Informationen