我正在尝试清理 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
和-exec
chmod
某个地方发挥作用。我还希望选择机制能够考虑 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