it-swarm.com.de

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

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

Jetzt möchte ich Schreibberechtigungen hinzufügen. Mit chmod könnte ich so etwas ausprobieren

chmod o+w -R mydir/

Aber das ist nicht cool, da ich das Verzeichnis nicht weltweit 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 zu geben. Gibt es einen besseren Weg?

26
Rogach

setfacl hat eine rekursive Option (-R) genau wie chmod:

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

es ermöglicht auch die Verwendung der Berechtigung Capital-x X, was bedeutet:

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

folgendes sollte funktionieren:

setfacl -R -m u:colleague:rwX .

(Alle Anführungszeichen stammen von man setfacl für acl-2.2.52 wie mit Debian geliefert)

41
umläute

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

setfacl -R -m u:colleague:rwX .

Für diejenigen, die ACL wiederholt erneut anwenden müssen (d. H. Wie "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 setfacl: foobar: Only directories can have default ACLs Zu vermeiden.

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 ) lautet Prozesssubstitution, was spezifisch für Bash ist. Möglicherweise müssen Sie eine temporäre Datei erstellen, wenn Sie eine andere Shell verwenden.

6
Franklin Piat
for i in $(find /data -mindepth 0 -type d)
do setfacl -m  u:zabbix:r-x $i
    echo "ACL rules set for "$i
done
0
shgurbanov