Gibt es eine Möglichkeit, sudo anzuweisen, meinen Benutzernamen als Eigentümer für die anstelle von root erstellten Dateien festzulegen?

19

Wenn ich eine mache sudo cp /etc/foo.txt ~/foo.txt, wird die neue Datei mit rootals Eigentümer erstellt.

Im Moment sehe ich keinen anderen Weg, als die letzten beiden Befehle zu verwenden ( lsum 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:

  1. Tun Sie es in einem sudoBefehl.
  2. Ich muss meinen aktuellen Benutzer nicht angeben (vielleicht eine Variable verwenden?).
Belmin Fernandez
quelle
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.
JW013

Antworten:

32

Verwenden Sie installanstelle von cp:

sudo install -o belmin /etc/foo.txt ~/foo.txt
Jenny D
quelle
War nicht bewusst install. Vielen Dank.
Belmin Fernandez
4
@BelminFernandez: Um Ihrer zweiten Präferenz sudo install -o "$USER" /etc/foo.txt ~/foo.txt
gerecht zu werden
14

Mit einem POSIX-kompatibelcp können Sie sudo cp -p foo barauf die folgende Datei - Metadaten erhalten beim Kopieren:

  • Zugriffszeit
  • Änderungszeit
  • Benutzeridentifikation
  • Gruppen-ID
  • Modus

Wenn Sie einen anderen Benutzer einstellen möchten, ist die Lösung von JennyD die beste.

l0b0
quelle
2
Das funktioniert nur, wenn die ursprüngliche Datei dem Zielbenutzer gehört.
Jenny D
4
Ich gehe davon aus, dass die Person, die sudo ausführt, die Originaldatei nicht besitzt, da sie sonst sudo nicht verwenden müsste.
EightBitTony
@EightBitTony Sie müssen keine sudoDatei kopieren, die Sie nicht besitzen. Schließlich brauchen Sie nur Lesezugriff .
20.
Ja, ich habe mich vertippt - aber ich gehe davon aus, dass die betreffende Benutzer-ID die Datei auch nicht lesen kann, da sie noch kein sudo benötigt. Wir müssen also davon ausgehen, dass die Benutzer-ID, die die endgültige Datei besitzen soll, keinen Zugriff auf die Originaldatei hat. In beiden Fällen handelt es sich nicht um ein Sudo-Problem. Ihre Antwort schlägt vor, einen Eigentümer beizubehalten, von dem wir annehmen müssen, dass er nicht erwünscht ist.
EightBitTony
2
Theoretisch ist es möglich, dass die Datei dem Zielbenutzer gehört, sich jedoch in einem Verzeichnis befindet, zu dessen Eingabe der Zielbenutzer nicht berechtigt ist. Aber es ist nicht sehr wahrscheinlich :-)
Jenny D
8

Wenn Sie tun:

sudo cat /etc/foo.txt > ~/foo.txt

Dann ~/foo.txtwird von der Shell geöffnet, wie Sie (also mit Ihren Anmeldeinformationen erstellt), und sudowird 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. Hier rootnutzt 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.txtes sich zum Beispiel um einen Symlink handelt).

Stéphane Chazelas
quelle
2
Dies setzt voraus, dass der Benutzer in das Zielverzeichnis schreiben kann.
Johan
3

Mit sudowechseln 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 ( rootin diesem Fall) ein anderer Benutzer sein , um Zugriff zu erhalten.

Es gibt keine Möglichkeit für sudosich, dies zu verwalten, da sudoSie lediglich zum anderen Benutzer wechseln, um den Befehl auszuführen.

Du wirst brauchen

  1. benutze weiterhin zwei Befehle (oder einen zusammengesetzten Befehl)
  2. einen anderen Befehl finden (wie install, in einer anderen Antwort zu sehen)
  3. oder schreiben Sie ein Skript und führen Sie dieses Skript über aus sudo.
EightBitTony
quelle
1

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 cpioFolgendes 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 -pdmbedeutet "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

Johan
quelle