![¿Cómo puedo enumerar los permisos de cada componente en una ruta de archivo?](https://rvso.com/image/1388804/%C2%BFC%C3%B3mo%20puedo%20enumerar%20los%20permisos%20de%20cada%20componente%20en%20una%20ruta%20de%20archivo%3F.png)
A veces es necesario determinar en qué directorio de una ruta están limitados los derechos de acceso. Aquí hay un ejemplo:
$ ls /sys/kernel/debug/usb/devices
ls: cannot access /sys/kernel/debug/usb/devices: Permission denied
$ cat /sys/kernel/debug/usb/devices
cat: /sys/kernel/debug/usb/devices: Permission denied
Ninguno ls
de los dos cat
muestra dónde se limitaron los derechos de los usuarios.
¿Cuál es la forma más sencilla de mostrar los derechos de acceso para cada componente (directorio y archivo) en la ruta? Estoy principalmente interesado en soluciones para sistemas tipo Unix.
Respuesta1
Para permisos básicos de UNIX (propietario/grupo/otro), utilice namei
el que forma parte deutilidad-linux:
# nombrei -l /sys/kernel/debug/usb/devices f: /sys/kernel/debug/usb/dispositivos drwxr-xr-x raíz raíz / dr-xr-xr-x sistema raíz raíz kernel raíz drwxr-xr-x drwx------ depuración raíz raíz drwxr-xr-x raíz raíz usb -r--r--r-- dispositivos raíz raíz
Respuesta2
A continuación se muestra un script de shell simple tipo Bourne. Atraviesa la ruta eliminando gradualmente los últimos componentes usando el dirname
comando hasta que la ruta deja de cambiar. Obtienes /
o .
al final.
#!/bin/sh
f="$1"
p=
while test "$f" != "$p" ; do
ls -ld "$f"
p="$f"
f="$(dirname "$f")"
done
En una sola línea para sudo
poder ver componentes con derechos de acceso limitados:
f=/sys/kernel/debug/usb/devices p= ; while test "$f" != "$p" ; do sudo ls -ld "$f" ; p="$f" ; f="$(dirname "$f")" ; done
Salida de ejemplo
-r--r--r-- 1 root root 0 Dec 5 10:36 /sys/kernel/debug/usb/devices
drwxr-xr-x 3 root root 0 Dec 5 10:36 /sys/kernel/debug/usb
drwx------ 19 root root 0 Dec 5 10:36 /sys/kernel/debug
drwxr-xr-x 7 root root 0 Dec 5 10:37 /sys/kernel
drwxr-xr-x 13 root root 0 Dec 5 10:37 /sys
drwxr-xr-x 27 root root 4096 Dec 3 09:39 /
ACL POSIX
Si la cadena de permiso ls -l
se muestra +
al final, debe enumerar ACL usando getfacl
para ver los derechos de acceso completos:
#!/bin/sh
f="$1"
p=
while test "$f" != "$p" ; do
getfacl "$f"
p="$f"
f="$(dirname "$f")"
done