У меня часто возникает проблема, что программа - например, apache - может не получить доступ к определенному файлу или каталогу.
Решение проблемы означает ручную проверку файла и каждого отдельного каталога на пути до root и посмотреть, может ли пользователь или группа программы получить к нему доступ. Это утомительно.
Какая программа может автоматически сказать мне, в чем проблема?
Я представляю, как сообщаю программе путь, пользователя и группу - и она показывает мне, где в дереве проблема. Обратите внимание, что я знаю о таких проблемах, как символические ссылки и Apache. -FollowSymLinks
директива, которая не может быть обнаружена таким образом.
Предполагая, что у вас есть права root в системе, вы можете использовать это
sudo -u USER -g GROUP find ROOTDIR -exec test \! -r {} \; -ls
где USER и GROUP следует заменить на имя пользователя и имя группы, доступ к которым должен быть оценен, а ROOTDIR - это верхний каталог дерева каталогов, под которым будет выполняться оценка.
Обратите внимание, что sudo
должны быть соответствующим образом настроены, что означает, что root должен иметь право действовать как любой пользователь, а также любая группа.
Команда работает путем выполнения test
утилита для всех файлов и каталогов в ROOTDIR. Параметры, переданные утилите, заставляют ее возвращать успешный (нулевой) код выхода всякий раз, когда это возможно. не доступ к заданному файлу или каталогу. Этот код выхода затем используется find
чтобы определить, печатать ли имя файла или каталога (-ls
).
Вывод - это список файлов и каталогов, в которые USER: GROUP выполняет не иметь доступ с дополнительной информацией о каждом файле и каталоге, аналогичной выводам ls -l
(т.е. с разрешениями, владельцем, временем модификации и т. д.).
Вы можете протестировать различные виды разрешений, заменив -r
с другим вариантом, см. мужской тест. Вы можете заменить -ls
с участием -print
если вам нужна не дополнительная информация о каждом файле и каталоге, а только их имя. Обратите внимание: если команда находит каталоги, по которым она не может пройти, она также будет жаловаться на stderr. В зависимости от того, на что вы переходите test
это может быть поверхностным и может быть отброшено перенаправлением.
Я собрал этот простой сценарий оболочки [*]. Лучше всего работает с root:
my_path=/home/me/Documents/a/b/c/file.txt
while [[ "$my_path" != "/" ]] ; do
ls -lLd "$my_path"
my_path="`dirname \"$my_path\"`"
done
Он по-прежнему требует некоторой постобработки, но я не знаю элегантного способа проверить, есть ли у конкретного пользователя разрешение x для каталога (для этого потребуется либо su -c "test -x"
или утомительный разбор stat -t
).
[*] работает как в bash, так и в ksh
Команда tree
поможет вам с этой задачей.
Из man tree
:
Tree - это рекурсивная программа для составления списка каталогов, которая создает список файлов с глубоким отступом.
Я построил простой пример, демонстрирующий это использование:
$ mkdir {a,b,c}/{1,2,3}
$ ls *
a:
1 2 3
b:
1 2 3
c:
1 2 3
$
$ tree
.
|-- a
| |-- 1
| |-- 2
| `-- 3
|-- b
| |-- 1
| |-- 2
| `-- 3
`-- c
|-- 1
|-- 2
`-- 3
12 directories, 0 files
$ sudo chown root b && sudo chmod go-rwx b
$ tree
.
|-- a
| |-- 1
| |-- 2
| `-- 3
|-- b [error opening dir]
`-- c
|-- 1
|-- 2
`-- 3
9 directories, 0 files
Вы можете запустить tree
как пользователь, о котором идет речь, чтобы увидеть, где начинается проблема. Вам нужно будет исправить найденную проблему и повторно запустить программу до тех пор, пока не исчезнут ошибки, чтобы использовать это как инструмент восстановления, но, поскольку вы можете использовать tree -if
чтобы убрать отступы и напечатать полные пути, вы можете взломать скрипт, который запускает tree, greps для "error Opening dir", grants apache
доступ к этому каталогу и перезапустится.