13

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

4

2 回答 2

18

使用find命令:

find . ! -perm -o=r

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

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

您可以以用户身份运行此命令www-data

find . ! -readable

查找 Web 服务器无法读取的所有文件。

于 2015-05-03T02:05:10.443 回答
5

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

find . ! -perm -o=r
  • 匹配当前目录的子树 ( .) 中的所有文件和目录
    • 要将匹配限制为仅文件,请附加-type f.
  • 没有()具有为安全主体“其他(世界)”()设置的读取权限()!ro

这可以按预期工作,只要检查的所有文件既不是由运行 web 服务器的用户帐户创建的,也不属于 web 服务器帐户所属的。通常情况就是这样。

上面的命令是POSIX-compliant


mcleod_ideafix 的答案提供了一个更强大的选项,可用于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 \)

至于什么不起作用_

  • 诸如 sfind . -perm 700和之类的命令find . -perm 600 只会匹配具有该确切模式的文件(700转换为u=rwx,go=, 600to u=rw,go=),因此您必须为用户和组权限的所有可能变体构造命令以查找所有感兴趣的匹配项。
  • find . -perm -o-r从根本上被破坏并且总是匹配任何文件或目录
    • -传递给的值的前缀-perm指定在匹配文件中设置随后的所有权限。
    • -perm只允许正向匹配权限(设置的内容与未设置的内容相对),因此从根本上不可能仅使用-perm参数来表达“在未设置此权限时匹配”逻辑。
      • 虽然-r语法上受支持(因为它是有效的chmod语法),但在这里毫无意义并导致无操作。
      • 从技术上讲,-o-r告诉从用于匹配的模式掩码的起始值中-perm减去(删除)“其他”的读取权限位;由于该起始值是000,或者象征性地,a=,任何从中减去权限的尝试都将是无操作的,即没有效果。用比利·普雷斯顿(Billy Preston)和布鲁斯·费舍尔(Bruce Fisher)的不朽名言来表达:Nothing from nothing' leave nothing'
      • 最终效果是对可能匹配的文件或目录的权限没有任何限制,因此所有项目都无条件匹配。
    • 因此,唯一的选择是让-perm 自身匹配( -perm -o=r),然后通过将的否定运算符 ,放在它之前来否定find!结果。
于 2015-05-03T19:50:49.570 回答