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

Yin*_*ong 6 linux bash public-html server

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

mcl*_*fix 9

使用find命令:

find . ! -perm -o=r
Run Code Online (Sandbox Code Playgroud)

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

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

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

find . ! -readable
Run Code Online (Sandbox Code Playgroud)

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


mkl*_*nt0 7

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

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

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

上述命令符合POSIX 标准


mcleod_ideafix 的答案提供了一个更强大的选项,可用于GNU find的(非标准) -readable测试:

当在网络服务器的用户帐户上下文中运行时(在 Linux 上www-data),这只会匹配网络服务器实际上无法读取的文件和目录,而不管哪个用户和组拥有该文件

sudo -u www-data find . ! -readable -prune
Run Code Online (Sandbox Code Playgroud)

请注意,这-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=因此任何从中减去权限的尝试都将是无操作,即没有效果。用比利·普雷斯顿和布鲁斯·费舍尔的不朽名言来说:Nothing from nothing leaves nothing
      • 最终效果是对可能匹配的文件或目录的权限没有任何限制,因此所有项目都无条件匹配。
    • 因此,唯一的选择是使其-perm 自身正向匹配( -perm -o=r),然后通过在其前面放置 的否定运算符来否定结果find!