Назад | Перейти на главную страницу

Автоматически находить проблемы с разрешениями каталога

У меня часто возникает проблема, что программа - например, 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 доступ к этому каталогу и перезапустится.