Wenn ich eine mache sudo cp /etc/foo.txt ~/foo.txt
, wird die neue Datei mit root
als Eigentümer erstellt.
Im Moment sehe ich keinen anderen Weg, als die letzten beiden Befehle zu verwenden ( ls
um den Anwendungsfall zu klären):
belmin@server1$ ls /etc/foo.txt
> -rw------- 1 root root 3848 Mar 6 20:35 /etc/foo.txt
>
belmin@server1$ sudo cp /etc/foo.txt ~/foo.txt
belmin@server1$ sudo chown belmin: $_
Ich würde bevorzugen:
- Tun Sie es in einem
sudo
Befehl. - Ich muss meinen aktuellen Benutzer nicht angeben (vielleicht eine Variable verwenden?).
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.Antworten:
Verwenden Sie
install
anstelle voncp
:quelle
install
. Vielen Dank.sudo install -o "$USER" /etc/foo.txt ~/foo.txt
Mit einem POSIX-kompatibel
cp
können Siesudo cp -p foo bar
auf die folgende Datei - Metadaten erhalten beim Kopieren:Wenn Sie einen anderen Benutzer einstellen möchten, ist die Lösung von JennyD die beste.
quelle
sudo
Datei kopieren, die Sie nicht besitzen. Schließlich brauchen Sie nur Lesezugriff .Wenn Sie tun:
Dann
~/foo.txt
wird von der Shell geöffnet, wie Sie (also mit Ihren Anmeldeinformationen erstellt), undsudo
wird dann mit der dazu umgeleiteten stdout ausgeführt.Am Ende gehört die Datei Ihnen.
Diese Art von Ansatz hilft auch dabei, die durchgeführten Aktionen einzuschränken
root
. Hierroot
nutzt er nur sein Privileg zum Öffnen/etc/foo.txt
, tut aber nicht das, was potenziell schädlich ist (öffne eine Datei zum Schreiben, was schlimme Konsequenzen haben könnte, wenn~/foo.txt
es sich zum Beispiel um einen Symlink handelt).quelle
Mit
sudo
wechseln Sie zu einem anderen Benutzer. Das ist der springende Punkt des Befehls. Ich gehe davon aus, dass Sie keinen regulären Zugriff auf die erste Datei haben. Daher müssen Sie (root
in diesem Fall) ein anderer Benutzer sein , um Zugriff zu erhalten.Es gibt keine Möglichkeit für
sudo
sich, dies zu verwalten, dasudo
Sie lediglich zum anderen Benutzer wechseln, um den Befehl auszuführen.Du wirst brauchen
sudo
.quelle
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.
(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 ichls
, 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
quelle