验证 Apache(或任何账户)是否具有导航到目录的适当权限的脚本

验证 Apache(或任何账户)是否具有导航到目录的适当权限的脚本

看来 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

相关内容