Wie setze ich Berechtigungen für ein Verzeichnis rekursiv (mit aktivierter ACL)?

24

Zum Beispiel möchte ich meinen Kollegen Schreibzugriff auf ein bestimmtes Verzeichnis gewähren. Nehmen wir an, dass Unterverzeichnisse Zugriffsrechte 775, Dateien 664 und einige ausführbare Dateien im Verzeichnis 775 hatten.

Jetzt möchte ich Schreibrechte hinzufügen. Mit chmod könnte ich sowas probieren

chmod o+w -R mydir/

Aber das ist nicht cool, da ich das Verzeichnis nicht für die ganze Welt beschreibbar machen möchte. Ich möchte nur bestimmten Benutzern Zugriff gewähren, daher möchte ich ACL verwenden. Aber gibt es eine einfache Möglichkeit, diese Berechtigungen festzulegen? Aus meiner Sicht muss ich mindestens drei Fälle (Verzeichnisse, Dateien, ausführbare Dateien) separat behandeln:

find -type d -exec setfacl -m u:colleague:rwx {} \;
find -type f -executable -exec setfacl -m u:colleague:rwx {} \;
find -type f \! -executable -exec setfacl -m u:colleague:rw {} \;

Es scheint ziemlich viele Codezeilen für eine so einfache Aufgabe. Gibt es einen besseren Weg?

Rogach
quelle

Antworten:

39

setfaclhat eine rekursive Option ( -R) wie chmod:

  -R, --recursive
      Apply operations to all files and directories recursively. This
      option cannot be mixed with `--restore'.

es erlaubt auch die Verwendung der capital-x- XErlaubnis, was bedeutet:

  execute only if the file is a directory or already has
  execute permission for some user (X)

Folgendes sollte also funktionieren:

setfacl -R -m u:colleague:rwX .

(alle Zitate stammen aus man setfaclfür acl-2.2.52 als mit Debian ausgeliefert)

umläute
quelle
4
setfacl hat das '-R'-Flag in FreeBSD 9 nicht
Aaron C. de Bruyn
6
dann ist es gut, dass die OP ihre Frage als [linux]
umläute
Hab das verpasst. ;)
Aaron C. de Bruyn
Gilt dies automatisch für neue Dateien / Ordner, die später erstellt wurden?
Enigma
Überprüfen Sie die Manpage für Ihre Version von setfacl. Die Option -Xfunktioniert nicht wie erwartet in enthalten setfacl 2.2.49.
Phyatt
4

Wie von umläute erwähnt, ist der Befehl setfacl -Rmit Großbuchstaben "X" der richtige Weg:

setfacl -R -m u:colleague:rwX .

Für diejenigen, die die ACL rekursiv erneut anwenden müssen (z. B. "Berechtigungen für Unterverzeichnisse erneut anwenden" à la Windows).

find . -mindepth 1 | xargs -n 50 setfacl -b --set-file=<(getfacl . | sed -e 's/x$/X/')

Dieser Befehl könnte aufgeteilt werden, um Fehler wie zu vermeiden setfacl: foobar: Only directories can have default ACLs.

find . -mindepth 1 -type d| xargs -n 50 setfacl -b --set-file=<(getfacl . | sed -e 's/x$/X/')
find . -mindepth 1 -type f| xargs -n 50 setfacl -b --set-file=<(getfacl . | grep -v '^default:' | sed -e 's/x$/X/')

Beachten Sie, dass die Syntax <( something )ist Prozess - Substitution , die spezifisch für bash ist. Sie müssen möglicherweise eine temporäre Datei erstellen, wenn Sie eine andere Shell verwenden.

Franklin Piat
quelle
-1
for i in $(find /data -mindepth 0 -type d)
do setfacl -m  u:zabbix:r-x $i
    echo "ACL rules set for "$i
done
shgurbanov
quelle
@muru Aus Neugier, warum nicht?
Shadur
Der ganze Kommentar ist ein Link. Folge ihm und finde es heraus.
Muru
Wenn Sie diesen Ansatz verwenden find /data -mindepth 0 -type d -exec setfacl -m u:zabbix:r-X {} \;
möchten
1
Benutze es nicht. $(find /data -mindepth 0 -type d)Gibt keine Ergebnisse zeilenweise zurück, sondern puffert die gesamten Ergebnisse. Wenn eine Zeile ein Leerzeichen enthält, erhalten Sie einen falschen Datensatz in $iVariable.
Gnought