Permitir al usuario recorrer la ruta al directorio dado

Permitir al usuario recorrer la ruta al directorio dado

Digamos que quiero darle a un usuario colleagueacceso 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 colleaguepueda 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 colleaguepueda atravesarlos) o, mejor aún, verificar si colleagueestá 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, rootel 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 setfaclagregando 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 || breakdespué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 rooty 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.

información relacionada