¿Cómo puedo enumerar los permisos de cada componente en una ruta de archivo?

10

A veces es necesario determinar en qué directorio de una ruta los derechos de acceso son limitados. 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

Ni lstampoco catmuestra dónde estaban limitados los derechos de usuario.

¿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.

pabouk
fuente

Respuestas:

17

Para permisos básicos de UNIX (propietario / grupo / otro), use el nameicual es parte de util-linux :

# namei -l / sys / kernel / debug / usb / devices
f: / sys / kernel / debug / usb / devices
raíz raíz drwxr-xr-x /
dr-xr-xr-x root root sys
núcleo raíz raíz drwxr-xr-x
drwx ------ depuración de raíz
raíz raíz drwxr-xr-x usb
-r - r - r-- dispositivos raíz raíz
usuario1686
fuente
1

A continuación se muestra un script simple de Bourne-like-shell. Atraviesa la ruta eliminando gradualmente los últimos componentes utilizando el dirnamecomando hasta que la ruta deja de cambiar. Tienes uno /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 sudopara 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 /

POSIX ACL

Si la cadena de permiso de ls -lmuestra +al final, debe enumerar ACL usando getfaclpara ver los derechos de acceso completos:

#!/bin/sh

f="$1"
p=
while test "$f" != "$p" ; do
    getfacl "$f"
    p="$f"
    f="$(dirname "$f")"
done
pabouk
fuente