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

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

Ich muss wgetetwas tun (resultiert in einer komprimierten Datei in cwd), dann muss ich es extrahieren, dann einige Kopier-/Verschiebe-/Änderungssachen machen und vielleicht schließlich ein Skript ausführen (aus dem heruntergeladenen Archiv).

Nun führen all diese Aufgaben entweder direkt ( wget, extrahieren usw.) oder indirekt (Ausführen des Skripts) dazu, dass Dateien und Verzeichnisse erstellt werden (alle im aktuellen Arbeitsverzeichnis). Ich mache das alles 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 auch mittendrin), muss ich eine Reihe von chmodund chownBefehlen eingeben, um alles richtig zu machen.

Nun wäre es schön, wenn man dem System irgendwie mitteilen könnte: „Von nun an werden Sie alle Dateien oder Verzeichnisse, die Sie erstellen, wenn ich Befehle als Root eingebe, mit den und den Eigentumsrechten und Berechtigungen erstellen.“

Antwort1

Sie können dies immer tun sudo -u username touch filename, wenn Ihr Skript als ausgeführt wird . Abhängig von Ihrer Konfiguration rootist normalerweise kein Kennwort erforderlich .sudoers

Alternativ können Sie 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 vereinbarungsgemäß aus.


Einige Befehle (wie mkdir) unterstützen Argumente zum Angeben der Berechtigungen:

mkdir -m 0700 foo

Standardmäßig befolgen Dateioperationen den umaskSatz für die Shell. Er definiert, welche Berechtigungenbestritten. umaskEin 0022BeispielnichtSchreibberechtigungen für die Gruppe und andere festlegen. Auf festlegen, 0077um zu verhindern, dass die Gruppe und andere irgendwelche Berechtigungen erhalten.


Sie können die setgidVerzeichnisse so einstellen, dass alle darin erstellten Dateien deren Gruppenmitgliedschaft erben:

chmod g+s someDir

Einige UnixeUnterstützungdasselbe Verhalten für setuid( chmod u+s), aber nicht für Linux.

Antwort2

Es gibt noch einen anderen Weg, der meiner Meinung nach ziemlich elegant ist. Mit install(1)

Beispielsweise benötigt zabbix-agentd einen Unterordner innerhalb von /var/run, aber neuere Distributionen verwenden tmpfs für /var/run, sodass das Verzeichnis Neustarts nicht übersteht. Ich habe das Problem 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

Antwort3

Auf Unix-ähnlichen Systemen gehören neu erstellte Dateien und Verzeichnisse dem Besitzer des Prozesses, der sie erstellt hat. Standard-Dienstprogramme bieten normalerweise keine Möglichkeit, den Besitzer 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_UID, $SUDO_GIDum auf den Benutzer zu verweisen, der sie aufgerufen hat sudo:

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

Automatisches Abrufen der Liste der erstellten Dateien und Verzeichnisse

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

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

oder Sie verwenden beispielsweiseInstallwatchwas auf dem Mechanismus basiert LD_PRELOAD.

Ideen für die weitere Arbeit

Basierend auf den oben genannten Methoden ist es möglich, ein Tool zu erstellen, das den Besitzer und ggf. die Zugriffsrechte der erstellten/geänderten Dateien automatisch ändert. Die Verwendung könnte ganz einfach sein:

sudo watch-chown do_something

verwandte Informationen