¿Cómo configuro permisos recursivamente en un directorio (con ACL habilitado)?

24

Por ejemplo, quiero darles a mis colegas acceso de escritura a cierto directorio. Supongamos que los subdirectorios en él tenían derechos de acceso 775, archivos 664, y también había algunos archivos ejecutables en el directorio - 775.

Ahora quiero agregar permisos de escritura. Con chmod, podría intentar algo como

chmod o+w -R mydir/

Pero eso no es bueno, ya que no quiero hacer que el directorio sea editable en todo el mundo, quiero dar acceso solo a ciertos usuarios, así que quiero usar ACL. ¿Pero hay una manera fácil de establecer esos permisos? Tal como lo veo, necesito abordar al menos tres casos (directorios, archivos, archivos ejecutables) por separado:

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

Parecen bastantes líneas de código para una tarea tan simple. ¿Hay una mejor manera?

Rogach
fuente

Respuestas:

40

setfacltiene una opción recursiva ( -R) como chmod:

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

también permite el uso del Xpermiso capital-x , lo que significa:

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

hacer lo siguiente debería funcionar:

setfacl -R -m u:colleague:rwX .

(todas las citas son de man setfaclpor acl-2.2.52 como entregado con Debian)

umläute
fuente
44
setfacl no tiene la bandera '-R' en FreeBSD 9
Aaron C. de Bruyn
66
entonces es bueno que el PO etiquetada como su pregunta [Linux]
Umlaute
Me perdí eso. ;)
Aaron C. de Bruyn
¿Esto se aplica automáticamente a los nuevos archivos / carpetas creados posteriormente?
Enigma
Consulte la página de manual de su versión de setfacl. La opción -Xno funciona como se esperaba incluida en setfacl 2.2.49.
phyatt
5

Como mencionó umläute, el comando setfacl -Rcon mayúscula "X" es el camino a seguir, como:

setfacl -R -m u:colleague:rwX .

Sin embargo, para aquellos que necesitan volver a aplicar ACL de forma recíproca (es decir, como "volver a aplicar permisos en subdirectorios" a la Windows).

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

Ese comando podría dividirse para evitar errores como 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/')

Tenga en cuenta que la sintaxis <( something )es la sustitución de procesos , que es específica de bash. Es posible que deba crear un archivo temporal si usa otro shell.

Franklin Piat
fuente
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
fuente
@muru Por curiosidad, ¿por qué no?
Shadur
Todo el comentario es un enlace. Sígalo y descúbralo.
muru
Si desea seguir este enfoque, usefind /data -mindepth 0 -type d -exec setfacl -m u:zabbix:r-X {} \;
sibaz
1
No lo uses. $(find /data -mindepth 0 -type d)no devolverá resultados línea por línea, almacenará los resultados completos. Si hay un espacio en una línea, obtendrá un registro incorrecto en la $ivariable.
Pensé el