Рекурсивно найти файлы, которые не являются общедоступными для чтения

Я хотел бы рекурсивно найти все файлы в моем 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 оператор отрицания, !, перед этим.
Другие вопросы по тегам