自动查找目录的权限问题

我经常遇到一个问题,例如apache程序可能不能访问某个文件或目录。

解决问题意味着手动检查文件和path中的每个目录,直到root,并查看程序的用户或组是否可以访问它。 这很乏味。

哪个程序能够自动告诉我问题在哪里?


我想我告诉程序的path,用户和组 – 它显示了问题在树的哪里。 请注意,我知道象symlinks和Apache的-FollowSymLinks指令这样的问题是无法检测到的。

假设你在系统上拥有root权限,你可以使用这个权限

 sudo -u USER -g GROUP find ROOTDIR -exec test \! -r {} \; -ls 

其中USER和GROUP应该用要评估访问权限的用户名和组名来代替,而ROOTDIR是在其下进行评估的目录树的顶层目录。

注意事项

请注意,必须适当地configurationsudo ,这意味着根应该被允许作为任何用户以及任何组。

怎么运行的

该命令通过对ROOTDIR下的所有文件和目录执行test工具来工作。 传递给该实用程序的选项使它无论何时无法访问给定的文件或目录,都会返回成功(零)退出代码。 这个退出代码然后被find用来决定是否打印文件或目录的名称( -ls )。

产量

输出是USER:GROUP 无法访问的文件和目录的列表,其中包含与ls -l的输出相似的每个文件和目录的额外信息(例如权限,所有权,修改时间等)。

有用的东西,你可以调整

您可以通过用不同的选项replace-r来testing不同types的权限,请参阅man test 。 如果您不需要关于每个文件和目录的额外信息,而只需要他们的名字,则可以用-printreplace-ls 。 请注意,如果命令find不能遍历的目录,它也会在stderr上投诉。 取决于你通过test这可能是肤浅的,可以通过redirect。

我把这个简单的shell [*]脚本放在一起。 当根源最好的时候工作:

 my_path=/home/me/Documents/a/b/c/file.txt while [[ "$my_path" != "/" ]] ; do ls -lLd "$my_path" my_path="`dirname \"$my_path\"`" done 

它仍然需要一些人工后处理,但我不知道任何优雅的方式来检查,如果一个特定的用户有一个目录的权限(这将需要su -c "test -x"或繁琐的stat -tparsingstat -t )。

[*]在bash和ksh中都可以使用

命令tree将帮助您完成此任务。

man tree

树是一个recursion的目录列表程序,产生一个深度缩进的文件列表。

我build立了一个简单的例子来演示这个用法:

 $ mkdir {a,b,c}/{1,2,3} $ ls * a: 1 2 3 b: 1 2 3 c: 1 2 3 $ $ tree . |-- a | |-- 1 | |-- 2 | `-- 3 |-- b | |-- 1 | |-- 2 | `-- 3 `-- c |-- 1 |-- 2 `-- 3 12 directories, 0 files $ sudo chown root b && sudo chmod go-rwx b $ tree . |-- a | |-- 1 | |-- 2 | `-- 3 |-- b [error opening dir] `-- c |-- 1 |-- 2 `-- 3 9 directories, 0 files 

您可以以有问题的用户身份运行tree ,以查看问题开始的位置。 你必须修复发现的问题并重新运行该程序,直到没有错误将其用作修复工具,但是如果您可以使用tree -if删除缩进并打印完整path,则可以修改脚本运行树,greps为“错误打开目录”,授予访问该目录的apache ,并重新启动自己。