根据文件类型正确设置执行位?

根据文件类型正确设置执行位?

我正在尝试清理 Apache Web 服务器上的权限。我发现很多带有执行位的文件通常没有(或不应该有):

$ 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-execchmod某个地方发挥作用。我还希望选择机制能够考虑 shebangs 和其他魔法标头;而不仅仅是依赖于[可能不正确的]执行位或[可能缺失的]扩展。但我的搜索并没有找到正确的答案。参见,Linux下如何只找到某个目录下的可执行文件?递归查找可执行文件

答案1

这将遍历您的文件并根据是否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以满足您的特定需求。

答案2

我现在不知道你的用例是什么,但我的 web 文件夹下很少有可执行文件。在生产机器上,我还删除了大多数文件的写权限。

对于特殊情况,我保留一个单独的文件,其中包括所有特定情况,例如哪些文件夹需要写入权限或不同的所有者,并使用它来覆盖默认值。

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

相关内容