Como posso listar permissões de cada componente em um caminho de arquivo?

10

Às vezes, é necessário determinar em qual diretório os direitos de acesso de um caminho são limitados. Aqui está um exemplo:

$ 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

Nem lsnem catmostra onde os direitos de usuário foram limitados.

Qual é a maneira mais simples de mostrar os direitos de acesso para cada componente (diretório e arquivo) no caminho? Estou interessado principalmente em soluções para sistemas do tipo Unix.

pabouk
fonte

Respostas:

17

Para permissões básicas do UNIX (proprietário / grupo / outro), use o nameique faz parte do util-linux :

# namei -l / sys / kernel / debug / usb / devices
f: / sys / kernel / debug / usb / devices
raiz raiz drwxr-xr-x /
sys de raiz dr-xr-xr-x root
kernel raiz raiz drwxr-xr-x
drwx ------ depuração de raiz root
drwxr-xr-x root root usb
-r - r - r-- dispositivos raiz raiz
user1686
fonte
1

Abaixo está um script simples do tipo Bourne. Ele percorre o caminho removendo gradualmente os últimos componentes usando o dirnamecomando até que o caminho pare de mudar. Você recebe um /ou .no final.

#!/bin/sh

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

Em uma única linha sudopara poder ver componentes com direitos de acesso limitados:

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

Saída de exemplo

-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

Se a cadeia de permissão de ls -lespectáculos +, no final você tem a lista ACL usando getfaclpara ver os direitos de acesso completos:

#!/bin/sh

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