Erstellen von Dateien und Verzeichnissen mit einem bestimmten Eigentümer (Benutzer / Gruppe) während des Sudoing

22

Ich brauche wgetetwas (führt zu einer komprimierten Datei in CWD), dann muss ich es extrahieren, dann etwas kopieren / verschieben / modifizieren und vielleicht schließlich ein Skript ausführen (aus dem heruntergeladenen Archiv).

Jetzt führen alle diese Aufgaben entweder direkt ( wget, extrahieren usw.) oder indirekt (Ausführen des Skripts) zum Erstellen von Dateien und Verzeichnissen (alle im aktuellen Arbeitsverzeichnis). Ich mache all diese Sachen als root(keine Möglichkeit, es mit dem endgültigen, gewünschten Benutzer zu tun).

Das Problem ist: Alles, was im Prozess erstellt wird, gehört root oder dem sudo-Benutzer. Wenn ich fertig bin (und manchmal in der Mitte Art und Weise), ich habe eine Reihe von zur Ausgabe chmodund chownBefehle richtig zu machen Dinge.

Jetzt wäre es schön, wenn Sie dem System irgendwie mitteilen könnten, dass "Sie von nun an alle Dateien oder Verzeichnisse, die Sie erstellen, wenn Sie Befehle als root ausgeben, mit diesem und jenem Besitz und diesen Berechtigungen erstellen würden".

Ashkan Kh. Nazary
quelle

Antworten:

26

Sie können jederzeit, sudo -u username touch filenamewenn Ihr Skript ausgeführt wird, als root. Abhängig von Ihrer sudoersKonfiguration ist normalerweise kein Kennwort erforderlich .

Alternativ können Sie auch ausführen su username -c touch filename. Die zusätzlichen Argumente werden an die Shell des Benutzers übergeben, und die -cOption an die Shell führt die angegebenen Befehle gemäß der Konvention aus.


Einige Befehle (wie mkdir) unterstützen Argumente, um die Berechtigungen anzugeben:

mkdir -m 0700 foo

Standardmäßig berücksichtigen Dateivorgänge den umaskSatz für die Shell. Es definiert, welche Berechtigungen verweigert werden . Ein umaskvon 0022zum Beispiel funktioniert nicht Satz Schreibberechtigungen für die Gruppe und andere. Aktivieren Sie diese Option, um 0077zu verhindern, dass Gruppen und andere Benutzer Berechtigungen erhalten.


Sie können die setgidVerzeichnisse on so einstellen , dass alle Dateien, die innerhalb von erstellt werden, ihre Gruppenzugehörigkeit übernehmen:

chmod g+s someDir

Einige Unixe unterstützen dasselbe Verhalten für setuid( chmod u+s), jedoch nicht Linux.

Daniel Beck
quelle
1
Ich denke, es ist sicher anzunehmen, dass es keine dedizierte Unterstützung für das gibt, was Sie verlangen. Nur der Superuser kann chownDateien an einen anderen Benutzer senden, und das Festlegen einer solchen Standardeinstellung kann zu Benutzerfehlern führen und anderen Benutzern Berechtigungen erteilen, ohne dass der rootBenutzer dies merkt.
Daniel Beck
10

Es gibt einen anderen Weg, ganz elegant finde ich. Installation verwenden (1)

Zum Beispiel benötigt zabbix-agentd einen Unterordner in / var / run, aber neuere Distributionen verwenden tmpfs für / var / run, sodass das Verzeichnis Neustarts nicht überlebt. Ich habe es gelöst, indem ich eine Datei / etc / sysconfig / zabbix-agentd erstellt habe, die Folgendes enthält:

install -g zabbix -o zabbix -d /var/run/zabbix
Angelo Turetta
quelle
1
Fügen Sie auch -m 0700zum Beispiel. Die antwort.
Ring Ø
3
Beachten Sie, dass installdas Verzeichnis erstellt und dann der Eigentümer / die Gruppe geändert wird. Es gibt also eine kurze Zeit, in der das Verzeichnis nicht den angegebenen Eigentümer / die angegebene Gruppe hat. In manchen Zusammenhängen kann es wichtig sein.
user368507
Dies funktioniert unter Alpine Linux
Mauricio Sánchez,
3

Auf Unix-ähnlichen Systemen gehören neu erstellte Dateien und Verzeichnisse dem Eigentümer des Prozesses, der sie erstellt hat. Standarddienstprogramme haben normalerweise keine Möglichkeit, den Eigentümer der erstellten Dateien zu ändern.

Variablen mit UID und GID des ursprünglichen Benutzers

Wenn Sie einige Befehle wiederholt ausführen, können Sie die Variablen verwenden $SUDO_UIDund $SUDO_GIDauf den Benutzer verweisen, der Folgendes aufgerufen hat sudo:

sudo sh -c "do_something ; chown -R \"\$SUDO_UID:\$SUDO_GID\" files and directories"

Die Liste der erstellten Dateien und Verzeichnisse wird automatisch abgerufen

Wenn Sie die Liste der erstellten (und möglicherweise geänderten) Dateien und Verzeichnisse automatisch erhalten möchten, können Sie Ihre Befehle unter straceÜberwachung ausführen, die auf dem ptrace()Syscall basiert :

strace -qqfe open,creat,mkdir,link,symlink,mknod -o '|your_processing_of_strace_output' do_something

oder Sie können zum Beispiel Installwatch verwenden, die auf dem LD_PRELOADMechanismus basiert .

Ideen für die weitere Arbeit

Basierend auf den oben genannten Methoden ist es möglich, ein Tool zu erstellen, das automatisch den Eigentümer ändert und möglicherweise auf die Rechte der erstellten / geänderten Dateien zugreift. Die Verwendung könnte so einfach sein wie:

sudo watch-chown do_something
Pabouk
quelle