web-dev-qa-db-fra.com

Comment définir des autorisations de manière récursive sur un répertoire (avec ACL activé)?

Par exemple, je veux donner à mes collègues un accès en écriture à certains répertoires. Supposons que les sous-répertoires contiennent des droits d'accès 775, les fichiers 664, ainsi que certains fichiers exécutables dans le répertoire - 775.

Maintenant, je veux ajouter des autorisations d'écriture. Avec chmod, je pourrais essayer quelque chose comme

chmod o+w -R mydir/

Mais ce n'est pas cool, car je ne veux pas rendre le répertoire accessible en écriture - je veux donner accès uniquement à certains utilisateurs, donc je veux utiliser ACL. Mais existe-t-il un moyen simple de définir ces autorisations? Selon moi, je dois aborder au moins trois cas (répertoires, fichiers, fichiers exécutables) séparément:

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 {} \;

Il semble que beaucoup de lignes de code pour une tâche aussi simple. Y a-t-il une meilleure façon?

26
Rogach

setfacl a une option récursive (-R) comme chmod:

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

il permet également l'utilisation de l'autorisation capital-x X, ce qui signifie:

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

ainsi, ce qui suit devrait fonctionner:

setfacl -R -m u:colleague:rwX .

(toutes les citations proviennent de man setfacl pour acl-2.2.52 fourni avec Debian)

41
umläute

Comme mentionné par umläute, la commande setfacl -R Avec "X" en majuscule est le chemin à parcourir, comme:

setfacl -R -m u:colleague:rwX .

Cependant, pour ceux qui ont besoin de réappliquer ACL de manière récurrente (c'est-à-dire comme "réappliquer les autorisations sur les sous-répertoires" à la Windows).

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

Cette commande pourrait être fractionnée pour éviter des erreurs comme 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/')

Notez que la syntaxe <( something ) est Substitution de processus, qui est spécifique à bash. Vous devrez peut-être créer un fichier temporaire si vous utilisez un autre shell.

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