Как я могу перечислить разрешения для каждого компонента в пути к файлу?
Иногда необходимо определить, по какому каталогу в пути права доступа ограничены. Вот пример:
$ 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-подобных систем.
2 ответа
Для базовых разрешений UNIX (владелец / группа / другое) используйте namei
которая является частью util-linux:
# namei -l / sys / kernel / debug / usb / devices f: / sys / kernel / debug / usb / devices корень drwxr-xr-x / dr-xr-xr-x root root sys drwxr-xr-x корневое корневое ядро drwx ------ отладка root root drwxr-xr-x root root usb -r - r - r-- корневые корневые устройства
Ниже приведен простой скрипт типа 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 ACL
Если строка разрешения от ls -l
шоу +
в конце вы должны перечислить ACL, используя getfacl
чтобы увидеть полные права доступа:
#!/bin/sh
f="$1"
p=
while test "$f" != "$p" ; do
getfacl "$f"
p="$f"
f="$(dirname "$f")"
done