Правильно установить бит выполнения на основе типа файла?

Я пытаюсь очистить разрешения на веб-сервере Apache. Я нахожу много файлов с битом выполнения, которые обычно не имеют его (или не должны иметь):

$ sudo find /var/www/html -executable -type f | grep '.png' /var/www/html/.../jquery.ui/themes/smoothness/images/ui-icons_2e83ff_256x240.png /var/www/html/.../jquery.ui/themes/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png /var/www/html/.../jquery.ui/themes/smoothness/images/ui-icons_cd0a0a_256x240.png ... 

Как установить бит выполнения для обычных файлов, которые обычно имеют его (например, программы, страницы PHP и скрипты Bash); и удалить его из обычных файлов, которые обычно не имеют его (например, TXT, PNG, JPG и ZIP-файлы)?

Я чувствую, что find с помощью -exec и chmod должен вступить в игру где-то. Я также ожидаю, что механизм отбора учтет shebangs и другие магические заголовки; и не просто полагаться на [потенциально некорректный] бит выполнения или [потенциально отсутствующий] расширение. Но мой поиск не подходит для правильного ответа. Cf., Как я могу найти только исполняемые файлы в определенном каталоге в Linux? и Рекурсивно найти исполняемые файлы .

  • Как удалить файл файловой системы NTFS, чье имя содержит «:»?
  • Использование resize2fs со смещением файловой системы
  • Лучшие параметры файловой системы ext4 для обработки образов виртуальных дисков
  • Странные файлы в корневом каталоге безопасны для их удаления?
  • Atime каталога NFS не обновляется
  • Является ли slash (/) частью имени корневого каталога Linux?
  • live dd поверх встроенной корневой части только для чтения
  • Модуль vfat не загружается (я пробовал очевидные исправления)
  • 2 Solutions collect form web for “Правильно установить бит выполнения на основе типа файла?”

    Это будет проходить через ваши файлы и установить исполняемый бит в зависимости от того, считает ли file файл исполняемым:

     find /var/www/html -type f -exec bash -c 'if file -b "$1" | grep -q executable; then chmod +x "$1"; else chmod -x "$1"; fi' None {} \; 

    Команда find очень похожа на вашу. Это изменение является добавлением команд bash. Это может быть проще понять, если они распределены по нескольким строкам следующим образом:

     if file -b "$1" | grep -q executable then chmod +x "$1" else chmod -x "$1" fi 

    Разумеется, вы можете изменить аргумент chmod для удовлетворения ваших конкретных потребностей.

    Я не сейчас использую ваш прецедент, но у меня редко есть исполняемые файлы под моей веб-папкой. И на производственных машинах я также удаляю разрешение на запись для большинства файлов.

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

     find /path/to/webroot/ -type f -exec chmod 644 -c '{}' \; find /path/to/webroot/ -type d -exec chmod 755 -c '{}' \; # change owner chmod root:www-data /path/to/webroot/ -R bash .fix-perm 

    где .fix-perm – это просто файл сценария

     #.fix-perm chmod g+w cache -R chmod g+w logs -R 
    Linux и Unix - лучшая ОС в мире.