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

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

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 lsde los dos catmuestra 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 nameiel 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 dirnamecomando 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 sudopoder 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 -lse muestra +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

información relacionada