
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/63
ist eine vom Kernel bereitgestellte Methode, um den Zugriff auf einen bereits geöffneten Datei-Handle über einen normalen Pfadnamen zu ermöglichen.
Allerdings sudo
gibt 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/63
und 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 -C
Flag für sudo
bietet 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 cat
alle 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