Sudo erstellt eine Umgebungsvariable "SUDO_USER", mit der Sie den Benutzer ermitteln können, der sich angemeldet hat (der Sudo ausgeführt hat).
Angenommen, Sie haben Sudo als Root-Benutzer (Sudo kann auch für den Zugriff auf andere Benutzer verwendet werden), können Sie ein Skript schreiben, um die folgenden beiden Schritte zu automatisieren.
cp source target
chown $SUDO_USER target
(Dies funktioniert nicht, wenn Sie Sudo an einen Benutzer ohne Rootberechtigung senden, da nur Rootberechtigte Dateien weitergeben können.)
Die Automatisierung wird ein wenig Arbeit sein. Wenn die Quelle eine einzelne Datei und das Ziel kein Verzeichnis ist, ist Ihre Arbeit abgeschlossen. Ich gehe davon aus, dass Sie die Frage gestellt haben, weil das Problem nur in komplexeren Situationen ein echtes Problem ist, z.
cp /path/source/some*files /path/target/directory/
Ein komplexes Skript, um herauszufinden, welche Dateien und welche Verzeichnisse übergeben werden, welche bereits vorhanden waren, welche tatsächlich überschrieben wurden und um den Besitz nur der erfolgreich kopierten Dateien zu ändern, konnte geschrieben werden.
Diese Arbeit wurde bereits durchgeführt. Sie können cpio
Folgendes verwenden: - Kopieren Sie die Dateien mit cpio, nachdem Sie sudo als Root-Benutzer verwendet haben. cpio benötigt eine Liste der zu kopierenden Dateien, sodass der Vorgang in zwei Schritten durchgeführt werden kann. Unten benutze ich ls
, um die Liste der zu kopierenden Dateien zu generieren.
ls /path/source/some*files | cpio -pdm --owner $SUDO_USER /path/target/directory/
Das -pdm
bedeutet "Passthrough-Modus, Verzeichnisse nach Bedarf erstellen, Änderungszeiten für Dateien beibehalten".
--owner $SUDO_USER"
Bewirkt, dass der angegebene Benutzer Eigentümer der Dateien ist.
Der letzte Operand ist das Verzeichnis, in dem cpio die Dateien speichern muss.
Weitere Informationen zu CPIO Awesomeness finden Sie auf der CPIO-Handbuchseite hier
Dies ist auch mit einem einzigen sudo-Befehl möglich. Angenommen, Ihr Benutzer hat Zugriffsrechte auf die Dateien, verwenden Sie sudo nur für den cpio-Teil wie folgt:
ls /path/source/some*files | cpio -pdm --owner $USER /path/target/directory/
In dem obigen Fall verwende ich $ USER anstelle von $ SUDO_USER, da es ausgewertet wird, bevor Sudo ausgeführt wird. Wenn der Benutzer keine Berechtigung zum Auflisten der Dateien hat, können Sie diese auch in ein Wrapper-Skript einfügen und den Wrapper mit sudo ausführen. Dies kann schwieriger werden, aber im einfachsten Fall benötigt der Wrapper zwei Argumente, eine Quelle und ein Ziel.
Dies geht in den Wrapper "cp_as_user":
ls $1 | cpio -pdm --owner $SUDO_USER $2
Dann benutze den Wrapper wie folgt:
sudo cp_as_user "/ pfad / zu / einigen * dateien" / pfad / zu / ziel / verzeichnis
sudo cat /etc/foo.txt > ~/foo.txt
. Dateien können aus einem bestimmten Grund nur von root gelesen werden. Denken Sie also daran, diesen Grund zu beachten, wenn Sie Kopien für Benutzer ohne Rootberechtigung lesbar machen.