我想递归地查找public_html
文件夹中所有不可公开读取的文件(即那些会导致 403 错误的文件)。有没有快速的 bash 命令?我正在使用运行 apache 的 Linux 服务器,如果相关的话。谢谢。
使用find
命令:
find . ! -perm -o=r
将在当前目录和子目录中搜索具有文件权限的文件,以便"其他人"组无法读取该文件。
find
手册页提供了这些选项的一些示例。
您可以以www-data
用户身份运行以下命令:
find . ! -readable
查找 Web 服务器无法读取的所有文件。
注意:这个答案最初是在mcleod_ideafix的答案仍然包含以下损坏的命令时编写的:find . -perm -o-r
; 这个答案的最后一部分解释了为什么它不起作用。
find . ! -perm -o=r
- 匹配当前目录子树中的所有文件和目录 (
.
)- 要限制仅与文件的匹配,请追加
-type f
。
- 要限制仅与文件的匹配,请追加
- 没有(
!
)为安全主体"其他(世界)"(o
)设置读取权限(r
)
只要检查的所有文件既不是由运行 Web 服务器的上下文的用户帐户创建的,也不是属于 Web 服务器帐户所属的组,就可以按预期工作。 通常情况下,情况就是这样。
上述命令符合POSIX 标准。
mcleod_ideafix的回答为GNUfind
的(非标准)-readable
测试提供了一个更健壮的选项:
当在Web服务器的用户帐户上下文中运行时(在Linux上,www-data
),这将仅匹配Web服务器实际上无法读取的文件和目录,而与哪个用户和组拥有该文件无关:
sudo -u www-data find . ! -readable -prune
请注意,-prune
可防止尝试下降到不可读的子目录,从而禁止显示警告。
- 如果您只想限制与文件的匹配,它会变得更加复杂:
sudo -u www-data find . ! -readable ( -type f -print -o -prune )
至于什么不起作用:
- 诸如 s
find . -perm 700
和find . -perm 600
之类的命令只会匹配具有该确切模式的文件(700
转换为u=rwx,go=
,600
转换为u=rw,go=
),因此您必须为用户和组权限的所有可能变体构建命令,以查找所有感兴趣的匹配项。 find . -perm -o-r
从根本上被破坏,并且总是匹配任何文件或目录:- 传递给
-perm
的值的-
前缀指定在匹配文件中设置后面的所有权限。 -perm
只允许权限的正匹配(设置了什么,而不是设置了什么),因此基本上不可能仅用一个-perm
参数来表达"仅在未设置此权限时才匹配"逻辑。- 虽然
-r
在语法上是受支持的(因为它chmod
语法有效),但它在这里毫无意义,并导致无操作。 - 从技术上讲,
-o-r
告诉-perm
从用于匹配的模式掩码的起始值中减去(删除)"其他"的读取权限位;由于该起始值是000
,或者,象征性地,a=
,任何从中减去权限的尝试都将是无操作,即没有效果。用比利·普雷斯顿(Billy Preston)和布鲁斯·费舍尔(Bruce Fisher)的不朽名言来说:从无到有的叶子不叶子 - 实际效果是对可能匹配的文件或目录的权限没有任何限制,因此所有项目都是无条件匹配的。
- 虽然
- 因此,唯一的选择是让
-perm
本身正匹配(-perm -o=r
),然后通过将find
的否定运算符!
放在它前面来否定结果。
- 传递给