Jak mogę wyświetlić listę uprawnień każdego komponentu w ścieżce pliku?

10

Czasami konieczne jest określenie, który katalog w ścieżce ma ograniczone prawa dostępu. Oto przykład:

$ 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

Ani lsnie catpokazuje, gdzie prawa użytkownika były ograniczone.

Jaki jest najprostszy sposób pokazania praw dostępu do każdego komponentu (katalogu i pliku) na ścieżce? Interesują mnie głównie rozwiązania dla systemów uniksopodobnych.

pabouk
źródło

Odpowiedzi:

17

W przypadku podstawowych uprawnień UNIX (właściciel / grupa / inny) użyj, nameiktóry jest częścią 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
Drwxr-xr-x jądro root
drwx ------ debugowanie roota
drwxr-xr-x root root usb
-r - r - r-- główne urządzenia root
użytkownik1686
źródło
1

Poniżej znajduje się prosty skrypt powłoki Bourne'a. Przemierza ścieżkę, stopniowo usuwając ostatnie komponenty za pomocą dirnamepolecenia, aż ścieżka przestanie się zmieniać. Masz albo /czy .na końcu.

#!/bin/sh

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

W jednym wierszu, sudoaby móc zobaczyć komponenty z ograniczonymi prawami dostępu:

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

Przykładowe dane wyjściowe

-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

Jeśli ciąg uprawnień z ls -lpokazuje +na końcu, musisz wyświetlić listę ACL, getfaclaby zobaczyć pełne prawa dostępu:

#!/bin/sh

f="$1"
p=
while test "$f" != "$p" ; do
    getfacl "$f"
    p="$f"
    f="$(dirname "$f")"
done
pabouk
źródło