2015-05-03 4 views
5

Я хотел бы рекурсивно найти все файлы в моей папке public_html, которые не являются общедоступными (т. Е. Те файлы, которые приведут к ошибке 403). Есть ли команда быстрого bash для этого? Я использую Linux-серверы под управлением apache, если это имеет значение. Благодарю.Рекурсивно найти файлы, которые не являются общедоступными

+0

Try [ '' cURL''] (http://curl.haxx.se/docs/manpage.html) –

+0

Благодарности @PatrickRoberts. Не могли бы вы объяснить свой ответ, пожалуйста? Кстати, я хочу сделать это на стороне сервера (как администратор, чтобы проверить, какие файлы могут вызвать проблемы), а не на стороне клиента (как пользователь, фактически загружая все файлы). –

+0

Зависит от того, какой сервер вы используете. Вы должны указать это в своем вопросе. –

ответ

7

Используйте find команду:

find . ! -perm -o=r 

будет искать файлы в текущем каталоге и подкаталогах, который имеет права доступа к файлу, так что группа «другие» не может прочитать файл.

На странице руководства для find приведены некоторые примеры этих вариантов.

Вы можете запустить эту команду как www-data пользователя:

find . ! -readable 

Чтобы найти все файлы, которые не доступны для чтения веб-сервер.

+0

Большое спасибо за ваш ответ, @cleod_ideafix. Но «найди. -perm -o-r' по-прежнему возвращает мне файлы, в которых группа 'others' имеет читаемый доступ (кажется, возвращает мне все файлы в папке). Но «найди. -perm 700' и ​​'find. -perm 600', похоже, работает. –

+1

@YingXiong: это должно быть 'find. ! -perm -o = r' – mklement0

+1

@ mklement0 Да, это работает. Благодаря! –

2

Примечание: Этот ответ был написан в то время как mcleod_ideafix's answer все еще содержали следующие сломана команду: find . -perm -o-r; последний раздел этого ответа объясняет, почему он не может работать.

find . ! -perm -o=r 
  • матчи всех файлов и каталогов в поддереве текущего каталога (в .)
    • , чтобы ограничить соответствие с файлов только добавить -type f.
  • которые делают не (!) имеют чтения разрешения (r) набор для основных безопасности "других (мира)" (o)

Это работает, как задумано, до тех пор, все проверенные файлы не были созданы учетной записью пользователя, в контексте которой веб-сервер работает и не принадлежит к группе, в которой учетная запись веб-сервера является членом. Как правило, это так.

команда POSIX-совместимый.


mcleod_ideafix's answer предлагает более надежный вариант доступный с GNUfind «с (нестандартным) -readable тест:

При запуске в контексте учетной записи пользователя на веб-сервер (о Linux, www-data), это будет соответствовать только файлам и каталогам, которые веб-сервер эффективно не может читать, независимо от того, какой пользователь и группа принадлежит файлу:

sudo -u www-data find . ! -readable -prune 

Обратите внимание, что -prune предотвращает попытки спускаться в нечитаемые подкаталогов и тем самым подавляет предупреждения.

  • Если вы хотите ограничить соответствия для файлов только, она становится все более сложным:
    sudo -u www-data find . ! -readable \(-type f -print -o -prune \)

Что касается , что не работы:

  • Команды, такие как с 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=, любая попытка вычесть разрешения из этого будет no-op, т. е. не имеет эффекта. Для того, чтобы поместить его в бессмертных словах Билли Престон и Брюс Фишер: Nothin' from nothin' leaves nothin'
      • чистого эффект что никаких ограничений вообще не помещаются на разрешениях потенциально соответствующие файлы или каталоги, так что все элементов безоговорочно соответствует.
    • Таким образом, единственным вариантом является -permсам матч положительно (-perm -o=r), а затем NEGATE результат путем размещения find «ы отрицания оператора, !, перед ним.
Смежные вопросы