Festlegen von Standardberechtigungen für Dateien, die in ein Verzeichnis verschoben oder kopiert werden?

11450
Rob

Meine Frage ähnelt dem Festlegen der Standarddateiberechtigungen für ALLE neu erstellten Dateien in Linux - unterscheidet sich jedoch in wichtigen Punkten:

Ich möchte, dass alle Dateien, die in einem bestimmten Verzeichnis erstellt (oder in ein solches Verzeichnis kopiert oder verschoben werden), einen Satz von Standardberechtigungen erben, der sich vom Systemstandard unterscheidet.

Begründung: Das betreffende Verzeichnis ist der "Einzugstrichter" für eine Anwendung. Benutzer in einer Gruppe legen Dateien in das Verzeichnis, und die App (die unter einer anderen Benutzer-ID in derselben Gruppe ausgeführt wird) nimmt sie und verarbeitet sie. Das Problem ist, dass der Eigentümer jeder Datei, die in dem Verzeichnis abgelegt wird, der Benutzer ist, der sie dort abgelegt hat, und dass die Berechtigungen standardmäßig "rw-r - r--" sind. Ich möchte das in "rw-rw ----" ändern. Die App, die die Aufnahme vornimmt, kann dies nicht explizit tun, da die Benutzer-ID, unter der die App ausgeführt wird, die betreffende Datei nicht besitzt und die Standardberechtigungen der App nicht erlauben, chmod für die Datei zu ändern! Natürlich könnte der Benutzer ein chmod machen, nachdem er die Datei dort abgelegt hat - aber ich möchte das "Ablegen" durch den Benutzer so einfach wie möglich halten. (Diese Leute sind nicht Linux-fähig,

umask scheint zu mächtig: Ich möchte nicht Standardberechtigungen für jede Datei festlegen, die von diesen Benutzern erstellt wurde - nur für diejenigen, die in diesem Verzeichnis erstellt wurden.

Bitte beraten ... danke!

8

3 Antworten auf die Frage

5
Dennis Williamson

Sie können eine ACL (Zugriffssteuerungsliste) verwenden, um die Standardberechtigungen für Dateien in einem Verzeichnis festzulegen.

Von man 5 acl:

Wenn eine Standard-ACL einem Verzeichnis zugeordnet ist, wird der Modusparameter für die Funktionen, die Dateiobjekte erstellen, und die Standard-ACL des Verzeichnisses verwendet, um die ACL des neuen Objekts zu bestimmen:

  1. Das neue Objekt erbt die Standard-ACL des enthaltenden Verzeichnisses als Zugriffs-ACL.

  2. Die Zugriffs-ACL-Einträge, die den Dateiberechtigungsbits entsprechen, werden so geändert, dass sie keine Berechtigungen enthalten, die nicht in den im Parameter mode angegebenen Berechtigungen enthalten sind.

Einrichten (Gerät, Verzeichnisse usw. entsprechend ändern):

Bearbeiten Sie Ihre /etc/fstabDatei und fügen Sie die aclMount-Option hinzu.

/dev/mapper/star-home /home ext3 defaults,acl 0 2 

Setzen Sie Ihr Dateisystem durch einen Neustart erneut auf ( Samba- mount.cifsManpage ) oder verwenden Sie:

mount -o remount,acl /home 

Stellen Sie sicher, dass Sie die Dienstprogramme setfaclund haben getfacl.

Legen Sie die Standard-ACL für das Verzeichnis fest (möglicherweise müssen Sie auch die ACL für vorhandene Dateien festlegen):

$ setfacl -m d:user:george:rwx,d:group:sales-g:rwx,d:group:marketing-g:rwx projections 

Weitere Informationen finden Sie in der verlinkten Anleitung.

Quelle: Tutorial Teil 1 und Teil 2

Referenz: POSIX-Zugriffssteuerungslisten unter Linux

Ich denke nicht, dass Sie `acl` als Option im` mount'-Befehl hinzufügen sollten, wenn Sie es in `/ etc / fstab` hinzugefügt haben. Es wird überflüssig sein, und wenn Sie den Befehl "mount" in Ihrer Antwort ausführen, erhalten Sie eine Ausgabe wie folgt: `/ dev / vda1 on / type ext4 (rw, errors = remount-ro, acl, acl)` (Siehe "acl, acl" am Ende). Bitte korrigieren Sie es, wenn ich mich nicht irre. its_me vor 9 Jahren 0
1
Peter Eisentraut

Ich kann eine Problemumgehung anbieten: Erstellen Sie ein separates "Drop" -Verzeichnis, führen Sie dort einen separaten Minijob aus, der die Berechtigungen festlegt, und verschiebt die Dateien dann in das Datenverzeichnis der Anwendung. Sie können inkron dafür verwenden, so dass es praktisch keine wahrnehmbare Zeitverzögerung gibt.

1
Arcege

Ich kann mir vier mögliche Methoden vorstellen:

  • umask, die Sie nicht verwenden möchten
  • Programmwrapper, der den umask der Anwendung festlegt, nicht den Benutzer
  • cron, wie @Peter Eisentraut beschrieben; find $HOME/intake -type f -exec chmod 660 {} \;, verschiedene Systeme haben Leistungsverbesserungen (wie die -exec+Option)
  • verzeichnisbasierte Einstellungen, für die ein wenig Shell-Programmierung erforderlich ist, aber im Grunde würde die Shell beim Festlegen der Eingabeaufforderung oder beim Aufruf von cd die Umask ändern, wenn in diesem Verzeichnis eine Punktdatei (oder möglicherweise ein Vorgängerverzeichnis) vorhanden ist; für bash PROMPT_COMMAND='test -s $PWD/.umask && umask $(cat $PWD/.umask)'";$PROMPT_COMMAND"wäre das einfachste.