似乎Apache至less需要读取和执行path的所有子目录的权限才能提供目录中的文件。
有没有人有脚本或单线可以validation这一点?
我想也许是一个bash脚本,将su - apache ,然后尝试导航到path中的每个目录。 我会尝试一些东西,如果我想出了一些有用的东西,我会发布。
对于Debian:
sudo -u www-data test -r /path/to/file && echo ok
考虑:
#!/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权限(比如多个主目录)来testing目录中文件的可访问性,例如:
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!
这是我得到的(必须作为一个用户可以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"
下面的find命令应该以root用户身份运行,或者至less有一个能够完全访问目录树的用户。 您将需要额外的检查来validation对find命令中使用的path的访问。 这可以通过运行命令作为目标用户来完成。 以非root用户身份运行时出现的故障应该适当处理。
将/srv/wwwreplace为符合您要求的相应目录或目录。 为其他用户适当地更改用户和组。 如果用户属于多个组,则需要为辅助组添加其他testing。 (在许多情况下,只标记次要群组拥有的文件可能就足够了。)
对于apache以www-data:www-data运行的系统,下面将find无法读取的文件。
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