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

24

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 des 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?

Rogach
la source

Réponses:

40

setfacla 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 d'utiliser l' Xautorisation capital-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 sont de man setfaclpour acl-2.2.52 comme livré avec Debian)

umläute
la source
4
setfacl n'a pas le drapeau '-R' dans FreeBSD 9
Aaron C. de Bruyn
6
alors c'est bien que l'OP ait marqué sa question comme [linux]
umläute
Ça m'a manqué. ;)
Aaron C. de Bruyn
Cela s'applique-t-il automatiquement aux nouveaux fichiers / dossiers créés ultérieurement?
Enigma
Consultez la page de manuel pour votre version de setfacl. L'option -Xne fonctionne pas comme prévu dans inclus dans setfacl 2.2.49.
phyatt
5

Comme mentionné par umläute, la commande setfacl -Ravec "X" 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 divisé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 Process Substitution , qui est spécifique à bash. Vous devrez peut-être créer un fichier temporaire si vous utilisez un autre shell.

Franklin Piat
la source
0
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
la source
@muru Par curiosité, pourquoi pas?
Shadur
L'ensemble du commentaire est un lien. Suivez-le et découvrez.
muru le
Si vous voulez utiliser cette approche, utilisezfind /data -mindepth 0 -type d -exec setfacl -m u:zabbix:r-X {} \;
sibaz
1
Ne l'utilise pas. $(find /data -mindepth 0 -type d)ne retournera pas les résultats ligne par ligne, il mettra en tampon l'ensemble des résultats. S'il y a un espace dans une ligne, vous obtiendrez un enregistrement incorrect dans la $ivariable.
Gnought