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?
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)
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.
for i in $(find /data -mindepth 0 -type d)
do setfacl -m u:zabbix:r-x $i
echo "ACL rules set for "$i
done