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



我想递归地查找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 )

至于什么不起作用

  • 诸如 sfind . -perm 700find . -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的否定运算符!放在它前面来否定结果

相关内容

  • 没有找到相关文章