Как перечислить разрешения каждого компонента в пути к файлу?

Как перечислить разрешения каждого компонента в пути к файлу?

Иногда необходимо определить, на какой каталог в пути права доступа ограничены. Вот пример:

$ 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

Ни то ls, ни другое не catпоказывает, где были ограничены права пользователя.

Какой самый простой способ показать права доступа для каждого компонента (каталога и файла) в пути? Меня в основном интересуют решения для Unix-подобных систем.

решение1

Для основных разрешений UNIX (владелец/группа/другие) используйте , nameiкоторый является частьюutil-linux:

# имяi -l /sys/kernel/debug/usb/devices
f: /sys/kernel/debug/usb/devices
drwxr-xr-x корень корень /
dr-xr-xr-x root корневая система
drwxr-xr-x root корневое ядро
drwx------ root root отладка
drwxr-xr-x root корневой usb
-r--r--r-- root корневые устройства

решение2

Ниже приведен простой скрипт Bourne-like-shell. Он проходит по пути, постепенно удаляя последние компоненты с помощью dirnameкоманды, пока путь не перестанет меняться. В конце вы получаете либо /либо ..

#!/bin/sh

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

В одной строке с sudoвозможностью просмотра компонентов с ограниченными правами доступа:

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

Пример вывода

-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-список контроля доступа

Если строка разрешений ls -lотображается +в конце, вам необходимо перечислить ACL, getfaclчтобы увидеть полные права доступа:

#!/bin/sh

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

Связанный контент