【问题标题】:Recursively find files that are not publicly readable递归查找不公开可读的文件
【发布时间】:2015-07-12 14:39:00
【问题描述】:

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

【问题讨论】:

  • 试试cURL
  • 谢谢@PatrickRoberts。你能详细说明你的答案吗?顺便说一句,我希望在服务器端(作为管理员检查哪些文件可能会导致问题)而不是在客户端(作为用户通过实际下载所有文件)来执行此操作。
  • 取决于您使用的服务器类型。你应该在你的问题中说明这一点。

标签: linux bash server public-html


【解决方案1】:

使用find 命令:

find . ! -perm -o=r

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

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

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

find . ! -readable

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

【讨论】:

  • 非常感谢您的回复,@cleod_ideafix。但是find . -perm -o-r 仍然返回给我others 组具有可读访问权限的文件(它似乎返回了我文件夹中的所有文件)。但是find . -perm 700find . -perm 600 似乎有效。
  • @YingXiong:应该是find . ! -perm -o=r
  • 还值得指出的是,find . ! -perm -o=r 符合 POSIX,而 -readable 主要(测试)是 GNU find 扩展。
  • 伟大的指针,但请修复从根本上损坏的第一个命令。
  • @mcleod_ideafix:谢谢; ++.
【解决方案2】:

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

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

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

above 命令是POSIX 兼容


mcleod_ideafix's answer 提供了一个更强大的选项,可用于 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 之类的命令 只会匹配具有该精确模式的文件700 转换为 @ 987654340@、600u=rw,go=),因此您必须为用户和组权限的所有可能变化构造命令,以找到所有感兴趣的匹配项。
  • find . -perm -o-r 从根本上被破坏并且总是匹配任何文件或目录
    • 传递给-perm 的值的- 前缀指定在匹配文件中设置所有权限。
    • -perm 只允许 匹配权限(设置的内容与未设置的内容相对),因此根本不可能表达“仅当未设置此权限时才匹配”逻辑只是一个-perm 参数只有
      • 虽然-r语法支持(因为它是有效的chmod 语法),但它在此处毫无意义并导致无操作。
      • 从技术上讲,-o-r 告诉-perm 从用于匹配的模式掩码的起始值中减去(删除)“其他”的读取权限位;由于该起始值为000,或者象征性地为a=,因此任何从中减去权限的尝试都是无操作的,即没有任何效果。用比利·普雷斯顿和布鲁斯·费舍尔不朽的话来说:Nothin' from nothin' leaves nothin'
      • 最终效果对可能匹配的文件或目录的权限没有任何限制,因此所有项都是无条件匹配。
    • 因此,唯一的选择是让-perm 自身 匹配 (-perm -o=r),然后否定find 的否定运算符 ! 放在其前面。

【讨论】:

    猜你喜欢
    • 2016-11-24
    • 2014-06-21
    • 2011-04-24
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    相关资源
    最近更新 更多