Wie lege ich Standardberechtigungen für Dateien fest, die in ein Verzeichnis verschoben oder kopiert werden?

9

Meine Frage ähnelt der Festlegung der Standarddateiberechtigungen für ALLE neu erstellten Dateien unter Linux , unterscheidet sich jedoch in wichtigen Punkten:

Ich möchte, dass alle Dateien, die in einem bestimmten Verzeichnis erstellt (oder in ein bestimmtes Verzeichnis kopiert oder in dieses verschoben) werden, eine Reihe von Standardberechtigungen erben, die sich von den Systemstandards unterscheiden.

Begründung: Das betreffende Verzeichnis ist der "Einlassbehälter" für eine Anwendung. Benutzer in einer Gruppe legen Dateien im Verzeichnis ab, 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 im Verzeichnis abgelegt wird, der Benutzer ist, der sie dort abgelegt hat, und 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 es der App nicht erlauben, die Datei zu ändern! Natürlich könnte der Benutzer einen chmod ausführen, nachdem er die Datei dort abgelegt hat - aber ich möchte das "Löschen" durch den Benutzer so einfach wie möglich halten. (Diese Leute sind nicht Linux-gebildet,

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

Bitte raten Sie ... danke!

rauben
quelle

Antworten:

5

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

Von man 5 acl:

Wenn einem Verzeichnis eine Standard-ACL zugeordnet ist, wird der ACL-Parameter für die Funktionen zum Erstellen von Dateiobjekten und die Standard-ACL des Verzeichnisses verwendet, um die ACL des neuen Objekts zu bestimmen:

  1. Das neue Objekt erbt die Standard-ACL des enthaltenen 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 durch den Parameter mode angegebenen Berechtigungen enthalten sind.

So richten Sie es ein (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

Stellen Sie Ihr Dateisystem erneut bereit ( Samba- mount.cifsManpage ), indem Sie es neu starten oder verwenden:

mount -o remount,acl /home

Stellen Sie sicher, dass Sie die setfaclund getfaclDienstprogramme haben.

Legen Sie die Standard-ACL für das Verzeichnis fest (möglicherweise müssen Sie die ACL auch 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 im verknüpften Tutorial.

Quelle: Tutorial Teil 1 und Teil 2

Referenz: POSIX-Zugriffssteuerungslisten unter Linux

Bis auf weiteres angehalten.
quelle
Ich denke nicht, dass Sie aclals Option im mountBefehl hinzufügen sollten, wenn Sie es hinzugefügt haben /etc/fstab. Es wird überflüssig und wenn Sie den mountBefehl in Ihrer Antwort ausführen , erhalten Sie eine Ausgabe wie folgt: /dev/vda1 on / type ext4 (rw,errors=remount-ro,acl,acl)(siehe acl,aclam Ende). Bitte korrigieren Sie es, wenn ich mich nicht irre.
its_me
1

Ich kann eine Problemumgehung anbieten: Erstellen Sie ein separates "Drop" -Verzeichnis, führen Sie dort einen separaten Minijob aus, der die Berechtigungen korrigiert, und verschieben Sie die Dateien dann in das Datenverzeichnis der Anwendung. Sie können dafür incron verwenden, sodass praktisch keine merkliche Zeitverzögerung auftritt.

Peter Eisentraut
quelle
1

Ich kann mir vier mögliche Methoden dafür vorstellen:

  • umask, die Sie nicht verwenden möchten
  • Programm-Wrapper, der die Umask dieser Anwendung festlegt, nicht die des Benutzers
  • cron, wie @Peter Eisentraut beschrieben; find $HOME/intake -type f -exec chmod 660 {} \;Verschiedene Systeme haben diesbezüglich 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 Aufrufen 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 am einfachsten.
Arcege
quelle