Рекурсивно найти файлы, которые не являются общедоступными для чтения
Я хотел бы рекурсивно найти все файлы в моем public_html
папка, которая не является общедоступной для чтения (то есть те файлы, которые вызовут ошибку 403). Есть ли быстрая команда bash для этого? Я использую серверы Linux, работающие под Apache, если это актуально. Благодарю.
2 ответа
Использовать find
команда:
find . ! -perm -o=r
Будет искать файлы в текущем каталоге и подкаталогах, которые имеют разрешение на доступ к файлам, так что группа "другие" не может прочитать этот файл.
Страница руководства для find
дает несколько примеров этих вариантов.
Вы можете запустить эту команду как www-data
пользователь:
find . ! -readable
Чтобы найти все файлы, которые НЕ читаются веб-сервером.
Примечание. Этот ответ был изначально написан, в то время как ответ mcleod_ideafix все еще содержал следующую неработающую команду: find . -perm -o-r
; последний раздел этого ответа объясняет, почему он не может работать.
find . ! -perm -o=r
- соответствует всем файлам и каталогам в поддереве текущего каталога (
.
)- ограничить сопоставление только файлами, добавить
-type f
,
- ограничить сопоставление только файлами, добавить
- которые нет (
!
) иметь разрешение на чтение (r
) набор для принципала безопасности "другие (мир)" (o
)
Это работает как задумано, поскольку все проверенные файлы не были созданы ни учетной записью пользователя, в контексте которой работает веб-сервер, ни принадлежали к группе, членом которой является учетная запись веб-сервера. Как правило, это так.
Приведенная выше команда является POSIX-совместимой.
Ответ mcleod_ideafix предлагает более надежную опцию, доступную в GNU find
S (нестандартный) -readable
тестовое задание:
При запуске в контексте учетной записи пользователя веб-сервера (в Linux www-data
), это будет соответствовать только файлам и каталогам, которые веб-сервер фактически не может прочитать, независимо от того, какой пользователь и группа владеют файлом:
sudo -u www-data find . ! -readable -prune
Обратите внимание, что -prune
предотвращает попытки спуститься в нечитаемые подкаталоги и тем самым подавляет предупреждения.
- Если вы хотите ограничить сопоставление только файлами, это усложняется:
sudo -u www-data find . ! -readable \( -type f -print -o -prune \)
Что касается того, что не работает:
- Команды, такие как s
find . -perm 700
а такжеfind . -perm 600
будет сопоставлять файлы только в этом режиме (700
переводит наu=rwx,go=
,600
вu=rw,go=
), поэтому вам нужно будет создать команды для всех возможных вариантов разрешений для пользователей и групп, чтобы найти все совпадения, представляющие интерес. find . -perm -o-r
принципиально сломан и неизменно совпадает с любым файлом или каталогом:-
-
префикс значения, переданного-perm
указывает, что все соответствующие разрешения должны быть установлены в соответствующих файлах. -perm
допускает только положительное сопоставление разрешений (то, что установлено, а не то, что НЕ установлено), поэтому принципиально невозможно выразить логику "совпадать, только если это разрешение НЕ установлено" только с-perm
только аргумент.- В то время как
-r
синтаксически поддерживается (потому что это действительноchmod
синтаксис), это здесь бессмысленно и приводит к неработоспособности. - Технически,
-o-r
говорит-perm
вычесть (удалить) бит разрешения на чтение для "других" из начального значения маски режима, используемой для сопоставления; так как это начальное значение000
или, что символически,a=
любая попытка вычесть разрешения из этого будет бесполезной, то есть не будет иметь никакого эффекта. Чтобы выразить это в бессмертных словах Билли Престона и Брюса Фишера: " Ничто из ничего не оставляет ничего" - Конечным эффектом является то, что на разрешения потенциально совпадающих файлов или каталогов не накладывается никаких ограничений, поэтому все элементы безоговорочно сопоставляются.
- В то время как
- Таким образом, единственным вариантом является
-perm
само по себе совпадение положительно (-perm -o=r
), а затем отрицать результат, поместивfind
оператор отрицания,!
, перед этим.
-