Como señala Gilles, setfacl
los permisos predeterminados especifican los permisos máximos, básicamente reemplazando el umask
. Entonces, los archivos recién creados serán rw
a menos que la aplicación que creó el archivo haya pedido especialmente que sea ejecutable.
$ 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--
Tenga en cuenta las permanentes efectivas anteriores. (Solo hay unos pocos programas que solicitarán establecer el bit de ejecución en los archivos que crea, por ejemplo, gcc
para ejecutables y cp
si el archivo que se está copiando era ejecutable.)
¿O quiso decir que el primer comando setfacl funcionaba como usted quería, pero el segundo no? En otras palabras, ¿está buscando arreglar los permisos en los archivos antiguos, asegurándose de que los directorios sean transitables, sin otorgar permisos de ejecución a otros archivos regulares?
Mi versión de setfacl
permite X
exactamente como usted quiere, por ejemplo:
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 su versión de setfacl
no es compatible con eso, ¿por qué no usar find
? ?
permisos de sobrescritura, configurándolos en rw para archivos y rwx para directorios
$ find . \( -type f -exec setfacl -m g:mygroup:rw '{}' ';' \) \
-o \( -type d -exec setfacl -m g:mygroup:rwx '{}' ';' \)
establecer permisos de ACL de mi grupo en función de los permisos de grupo existentes
$ find . \( -perm -g+x -exec setfacl -m g:mygroup:rw '{}' ';' \) \
-o \( -exec setfacl -m g:mygroup:rwx '{}' ';' \)
Probablemente querrá verificar que la máscara de grupo proporcione permisos efectivos. Si no, tendrás que ejecutar esto también:
$ find . -type d -exec chmod g+rwX '{}' ';'
Para futuros lectores, usar setfacl
en archivos/carpetas existentes sin agregar el bit ejecutable a sus archivos, la solución es esta parte de la respuesta de @Mikel:
Mi versión de setfacl permite X exactamente como usted quiere, por ejemplo:
setfacl g:mygroup:rwX
Extracto relevante del setfacl
documentación:
El campo permisos es una combinación de caracteres que indican los permisos:leer (r), escribir (w), ejecutar (x), ejecutar solo si el archivo es un directorio o ya tiene permiso de ejecución para algún usuario (X) .
Según tengo entendido, las ACL de Linux, setfacl -Rdm g:mygroup:rwx share_name
hace exactamente lo que quieres. Experimento:
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
Luego, como un usuario diferente en el grupo mygroup
:
$ cat foo/*
#!/bin/ls
#!/bin/ls
$ ./foo/data
ash: ./foo/data: Permission denied
$ ./foo/exec
./foo/exec
¿Qué está pasando?
$ getfacl foo/data
# file: foo/data
# owner: myuser
# group: mygroup
user::rw-
group::---
group:mygroup:rwx #effective:rw-
mask::rw-
other::---
La ACL efectiva para mygroup
es el resultado de and'ing el ACL_GROUP
entrada para mygroup
(rwx
) con la entrada ACL_MASK (rw-
).
La página de manual de acl(5) explica el cálculo de esto en "Algoritmos de verificación de acceso". No explica cómo ACL_MASK
se generan entradas, pero en la práctica parece suceder lo correcto.