Comme le souligne Gilles, setfacl
les autorisations par défaut spécifient les autorisations maximales, remplaçant essentiellement le umask
. Ainsi, les fichiers nouvellement créés seront rw
sauf si l'application qui a créé le fichier a spécialement demandé qu'il soit exécutable.
$ mkdir test
$ touch test/oldfile
$ getfacl test/oldfile
# file: test/oldfile
# owner: myuser
# group: myuser
user::rw-
group::r--
other::r--
$ setfacl -m d:g:mygroup:rwx test
$ touch test/newfile
$ getfacl test/newfile
# file: test/newfile
# owner: myuser
# group: myuser
user::rw-
group::r-x #effective:r--
group:mygroup:rwx #effective:rw-
mask::rw-
other::r--
Notez les permanentes efficaces ci-dessus. (Il n'y a que quelques programmes qui demanderont de définir le bit d'exécution sur les fichiers qu'il crée, par exemple gcc
pour les exécutables et cp
si le fichier copié était exécutable.)
Ou vouliez-vous dire que la première commande setfacl fonctionnait comme vous le souhaitiez, mais pas la seconde ? En d'autres termes, vous cherchez à corriger les autorisations sur les anciens fichiers, en vous assurant que les répertoires sont traversables, sans donner d'autres autorisations d'exécution aux fichiers normaux ?
Ma version de setfacl
autorise X
exactement comme vous le souhaitez, par exemple :
setfacl g:mygroup:rwX
$ setfacl --version
setfacl 2.2.49
$ rm -r test
$ mkdir test
$ mkdir test/olddir
$ touch test/oldfile
$ find test -ls
107513 4 drwxr-xr-x 3 myuser myuser 4096 Dec 22 01:56 test
107539 0 -rw-r--r-- 1 myuser myuser 0 Dec 22 01:56 test/oldfile
107529 4 drwxr-xr-x 2 myuser myuser 4096 Dec 22 01:56 test/olddir
$ setfacl -Rm g:somegroup:rwx test
$ find test -ls
107513 4 drwxrwxr-x 3 myuser myuser 4096 Dec 22 01:56 test
107539 0 -rw-rwxr-- 1 myuser myuser 0 Dec 22 01:56 test/oldfile
107529 4 drwxrwxr-x 2 myuser myuser 4096 Dec 22 01:56 test/olddir
$ rm -r test
$ mkdir test
$ mkdir test/olddir
$ touch test/oldfile
$ setfacl -Rm g:somegroup:rwX test
$ find test -ls
107513 4 drwxrwxr-x 3 myuser myuser 4096 Dec 22 01:56 test
107539 0 -rw-rw-r-- 1 myuser myuser 0 Dec 22 01:56 test/oldfile
107529 4 drwxrwxr-x 2 myuser myuser 4096 Dec 22 01:56 test/olddir
Si votre version de setfacl
ne supporte pas cela, pourquoi ne pas utiliser find
?
écraser les autorisations, en les définissant sur rw pour les fichiers et rwx pour les répertoires
$ find . \( -type f -exec setfacl -m g:mygroup:rw '{}' ';' \) \
-o \( -type d -exec setfacl -m g:mygroup:rwx '{}' ';' \)
définir les autorisations mygroup ACL en fonction des autorisations de groupe existantes
$ find . \( -perm -g+x -exec setfacl -m g:mygroup:rw '{}' ';' \) \
-o \( -exec setfacl -m g:mygroup:rwx '{}' ';' \)
Vous voudrez probablement vérifier que le masque de groupe fournit des autorisations effectives. Sinon, vous devrez également exécuter ceci :
$ find . -type d -exec chmod g+rwX '{}' ';'
Pour les futurs lecteurs, utiliser setfacl
sur les fichiers/dossiers existants sans ajouter le bit exécutable à vos fichiers, la solution est cette partie de la réponse de @Mikel :
Ma version de setfacl autorise X exactement comme vous le souhaitez, par exemple :
setfacl g:mygroup:rwX
Extrait pertinent du setfacl
documents :
Le champ perms est une combinaison de caractères qui indique les autorisations :lire (r), écrire (w), exécuter (x), exécuter uniquement si le fichier est un répertoire ou a déjà une autorisation d'exécution pour un utilisateur (X) .
Pour autant que je comprenne les ACL Linux, setfacl -Rdm g:mygroup:rwx share_name
fait exactement ce que vous voulez. Test :
umask 007
mkdir foo
chgrp mygroup foo
chmod 2700 foo
setfacl -d -m group:mygroup:rwx foo
setfacl -m group:mygroup:rwx foo
touch foo/data
echo '#!/bin/ls' >foo/exec
chmod +x foo/exec
Puis en tant qu'utilisateur différent dans le groupe mygroup
:
$ cat foo/*
#!/bin/ls
#!/bin/ls
$ ./foo/data
ash: ./foo/data: Permission denied
$ ./foo/exec
./foo/exec
Que se passe-t-il ?
$ getfacl foo/data
# file: foo/data
# owner: myuser
# group: mygroup
user::rw-
group::---
group:mygroup:rwx #effective:rw-
mask::rw-
other::---
L'ACL effective pour mygroup
est le résultat de and'ing le ACL_GROUP
entrée pour mygroup
(rwx
) avec l'entrée ACL_MASK (rw-
).
La page de manuel acl(5) explique ce calcul sous « Algorithmes de contrôle d'accès ». Il n'explique pas comment ACL_MASK
des entrées sont générées, mais en pratique, la bonne chose semble se produire.