递归查找不可公开读取的文件

Recursively find files that are not publicly readable

我想递归地查找我的 public_html 文件夹中所有不可公开读取的文件(即那些会导致 403 错误的文件)。有一个快速的 bash 命令吗?如果相关的话,我正在使用 Linux 服务器 运行 apache。谢谢

使用find命令:

find . ! -perm -o=r

将在当前目录和具有文件权限的子目录中搜索文件,以便 "others" 组无法读取该文件。

find 的手册页提供了这些选项的一些示例。

您可以 运行 作为 www-data 用户执行此命令:

find . ! -readable

查找 Web 服务器不可读的所有文件。

注意:这个答案最初是在 仍然包含以下 broken 命令时写的:find . -perm -o-r;这个答案的最后一部分解释了为什么它不能工作。

find . ! -perm -o=r
  • 匹配当前目录子树中的所有文件和目录 (.)
    • 要将匹配限制为仅 文件 ,请附加 -type f.
  • (!) 为安全主体设置了 read 权限 (r) "others (world)" (o)

只要检查的所有文件既不是由网络服务器 运行 在其上下文中的用户帐户创建的,也不属于网络服务器帐户 所在的组,这将按预期工作是的成员。 通常情况就是这样。

上述 命令是 POSIX-compliant.


提供 更强大的选项 可用于 GNU find(非标准)-readable 测试:

当 运行 在网络服务器用户帐户的上下文中(在 Linux、www-data 上)时,这将仅匹配网络服务器 有效的文件和目录 无法读取,无论哪个用户和组拥有该文件

sudo -u www-data find . ! -readable -prune

请注意,-prune 可防止尝试进入不可读的 子目录 ,从而抑制警告。

  • 如果你想限制匹配到文件,它会变得更复杂:
    sudo -u www-data find . ! -readable \( -type f -print -o -prune \)

至于什么没有工作:

  • 诸如 s find . -perm 700find . -perm 600 之类的命令将只匹配 完全 [=119] 的文件=] mode700 转换为 u=rwx,go=600 转换为 u=rw,go=),因此您必须为用户构建所有可能的命令和组权限以查找所有感兴趣的匹配项。
  • find . -perm -o-r 从根本上被破坏并且 总是匹配 任何 文件或目录 :
    • 传递给 -perm 的值的 - 前缀指定匹配文件中的所有后续权限 set
    • -perm 只允许 positive 匹配权限(已设置的与未设置的相对),因此 根本无法表达"match only if this permission is NOT set" 只有一个 -perm 参数的逻辑 只有 .
      • 虽然 -r 在语法上 受支持(因为它是有效的 chmod 语法),但它 毫无意义 此处并导致无操作。
      • 技术上,-o-r 告诉 -perm 减去 (移除)"others" 的读取许可位用于匹配的模式掩码;由于该起始值是 000,或者象征性地是 a=,任何从中减去权限的尝试都将是空操作,即无效​​。用 Billy Preston 和 Bruce Fisher 的不朽名言来说:Nothin' from nothin' leaves nothin'
      • 最终效果对可能匹配的文件或目录的权限没有任何限制,因此所有无条件匹配。
    • 因此,唯一的选择是让-perm自身匹配肯定-perm -o=r), 然后 取反 结果,方法是将 find 的取反运算符 ! 放在它前面。