Come posso elencare le autorizzazioni di each componente in un path di file?

A volte è necessario determinare in quale directory in un path i diritti di accesso sono limitati. Ecco un esempio:

$ 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 

lscat mostrano where i diritti dell'utente sono stati limitati.

Qual è il modo più semplice per visualizzare i diritti di accesso per each componente (directory e file) nel path? Sono principalmente interessato a soluzioni per sisthemes Unix.

Per le autorizzazioni di base UNIX (proprietario / gruppo / altro), utilizzare namei che fa parte di util-linux :

 # namei -l / sys / kernel / debug / usb / devices
 f: / sys / kernel / debug / usb / devices
 drwxr-xr-x root root /
 dr-xr-xr-x root root sys
 kernel root root di drwxr-xr-x
 drwx ------ root root debug
 drwxr-xr-x root root usb
 -r - r - r-- i dispositivi root di root

Di seguito è riportto un semplice script Bourne-like shell. Percorsa il path rimuovendo gradualmente gli ultimi componenti usando il command dirname finché il path non smette di cambiare. Ottieni o / o . alla fine.

 #!/bin/sh f="$1" p= while test "$f" != "$p" ; do ls -ld "$f" p="$f" f="$(dirname "$f")" done 

In una singola row con sudo per poter vedere i componenti con diritti di accesso limitati:

 f=/sys/kernel/debug/usb/devices p= ; while test "$f" != "$p" ; do sudo ls -ld "$f" ; p="$f" ; f="$(dirname "$f")" ; done 

Esempio di output

 -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

Se la string di authorization da ls -l mostra + alla fine è necessario elencare ACL utilizzando getfacl per visualizzare i diritti di accesso completi:

 #!/bin/sh f="$1" p= while test "$f" != "$p" ; do getfacl "$f" p="$f" f="$(dirname "$f")" done