看来 Apache 至少需要对路径的所有子目录具有读取和执行权限才能提供目录中的文件。
有没有人有可以验证这一点的脚本或单行代码?
我在想也许一个bash
脚本会su - apache
尝试导航到路径中的每个目录。我会尝试一些东西,如果我想到可行的方法,我会发布。
答案1
对于 Debian:
sudo -u www-data test -r /path/to/file && echo ok
答案2
考虑:
#!/bin/bash
# testperms.sh
if [ -r $1 ];
then echo "Can read file!";
else
echo "Cannot read file!";
fi
用法:
shultzc@lithium:~$ ./testperms.sh /etc/ssl
Can read file!
shultzc@lithium:~$ ./testperms.sh /etc/ssl/private
Cannot read file!
您应该能够根据自己的需要调整该代码。结合sudo
它可以轻松用于测试仅具有 +x 权限的目录中文件的可访问性(例如许多主目录),例如:
shultzc@lithium:~$ sudo -u www-data ./testperms.sh /home/shultzc/testperms.sh
Can read file!
shultzc@lithium:~$ sudo -u www-data ./testperms.sh /home/shultzc
Cannot read file!
答案3
这是我得到的(必须以可以执行以下操作的用户身份运行su - <test user>
:
#!/bin/bash
IFS='/'
CWD='/'
for dir in $2; do
# Set directory to test
if [[ $CWD == '/' ]]
then
CWD="/$dir"
else
CWD="${CWD}/${dir}"
fi
# Test if user has access
if !(su - $1 -c "cd $CWD" 2> /dev/null)
then
echo "$CWD - No access for $1"
exit -1
fi
done
echo "Access for $1 all the way through $2"
答案4
以下find
命令应以 root 身份运行,或者至少以对目录树具有完全访问权限的用户身份运行。您需要进行额外检查以验证对 find 命令中使用的路径的访问权限。这可以通过以目标用户身份运行命令来实现。以非 root 用户身份运行时的失败应得到适当处理。
根据您的要求替换/srv/www
为适当的目录。为其他用户适当更改用户和组。如果用户属于多个组,则需要为次要组添加其他测试。(在许多情况下,仅标记次要组拥有的文件可能就足够了。)
apache
对于按以下方式运行的系统www-data:www-data
将发现无法读取的文件。
find /srv/www ! -type d ! \( -user www-data -perm -400 \) -a ! \( -group www-data -perm -040 \) -a ! -perm -004
可访问目录的等效项是:
find /srv/www -type d ! \( -user www-data -perm -500 \) -a ! \( -group www-data -perm -050 \) -a ! -perm -005
对于不需要列出的目录,请使用上面的1
代替5
。已知名称的文件可以访问,但无法自动生成索引。
您可能还想确保只有少数文件或目录可以写入。下面查找也可以写入的文件和目录。
find -L /srv/www \( -user www-data -perm -200 \) -o \( -group www-data -perm -020 \) -a -perm -002