
Digamos que quiero darle a un usuario colleague
acceso de lectura a un directorio /rather/long/path/to/the/directory
, pero no necesariamente a sus directorios principales.
Como se explica por ejemploaquíyalláPrimero necesito asegurarme de que colleague
pueda atravesar el camino. Usando setfacl
:
setfacl -m u:colleague:x /rather
setfacl -m u:colleague:x /rather/long
setfacl -m u:colleague:x /rather/long/path
setfacl -m u:colleague:x /rather/long/path/to
setfacl -m u:colleague:x /rather/long/path/to/the
setfacl -m u:colleague:xr /rather/long/path/to/the/directory
Esto es bastante tedioso para un camino profundamente anidado. ¿Existe una forma más elegante de hacer esto?
PD: Para hacerlo un poco más difícil, siendo un usuario normal, es posible que no tenga derecho a cambiar los permisos para el directorio de nivel superior en la ruta (por ejemplo /home
). Si es posible, la solución debería ignorar estos directorios (suponiendo que colleague
pueda atravesarlos) o, mejor aún, verificar si colleague
está permitido atravesarlos y mostrar un mensaje de error, si no es así.
Respuesta1
La respuesta simple y estúpida:
Puedeacortarun poco tu secuencia de comandos combinando el primeronorte–1 de ellos:
conjuntofacl -mu:colega:x /más bien /más bien/largo /más bien/largo/camino /más bien/largo/camino/a /más bien/largo/camino/a/el conjuntofacl -mu:colega:xr /más bien/larga/ruta/al/directorio
Una advertencia "obvia":
Incluso si posee el directorio de destino (hoja), necesita tener acceso de ejecución (atravesar) a cada directorio en la ruta. Si hay algún directorio al que no tiene acceso y no es de su propiedad, no tiene suerte. (Debe asumir una identidad (es decir, root
el propietario del directorio) que le permita acceder o persuadir a alguien que tenga el poder para hacerlo. Eso está fuera del alcance de esta pregunta).
Pero, si hay directorios intermedios que usted posee pero a los que no tiene acceso (por ejemplo, alguien lo ha hecho chmod 0
), debe darse acceso a sí mismo.de arriba para abajo.
La respuesta: (TL;DR)
Hice el punto anterior porque esto funciona de abajo hacia arriba:
leaf="/más bien/long/ruta/al/directorio" rama="$hoja" mientras rama="$(dirname "$branch")" hacer conjuntofacl -mu:colega:x "$rama" || romper si [ "$rama" = / ] entonces romper fi hecho conjuntofacl -mu:colega:xr "$hoja"
Opcionalmente, puede ocultar cualquier mensaje de error setfacl
agregando 2> /dev/null
. Si tiene una situación patológica en la que posee /rather/long
y /rather/long/path/to
, pero no /rather/long/path
(pero sus permisos están abiertos), elimine el || break
después de setfacl
, porque necesita seguir trepando al árbol después de recibir el error setfacl … /rather/long/path
. De lo contrario, si no lo eres root
,podríaelimine la if [ "$branch" = / ]
prueba, porque el bucle terminará cuando alcance un nivel de directorio donde no pueda ejecutarlo setfacl
. (Pero esa no es una gran idea; si guarda esto como un script, algún día lo ejecutará como root
y luego tendrá un bucle infinito).
No hace falta decir que, si convierte esto en un script, la ruta del directorio y el nombre del colega deben ser parámetros.