recursion查找不公开可读的文件

我想recursion地find我的public_html文件夹中的所有文件不公开可读(即那些将导致403错误的文件)。 有一个快速的bash命令吗? 我正在使用运行Apache的Linux服务器,如果这是相关的。 谢谢。

使用find命令:

 find . ! -perm -o=r 

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

find的手册页给出了这些选项的一些例子。

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

 find . ! -readable 

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

注意:这个答案原本是在mcleod_ideafix的答案中仍然包含下面的中断命令: find . -perm -or find . -perm -or ; 这个答案的最后一节解释了为什么它不能工作。

 find . ! -perm -o=r 
  • 匹配当前目录子树( . )中的所有文件和目录
    • 限制只匹配文件 ,append -type f
  • ! )对安全主体“其他(世界)”( o )具有权限( r

只要检查的所有文件既不是由用户帐户在其上下文中创建的,也不属于Web服务器帐户所属的组。 通常,情况就是如此。

以上命令是符合POSIX的


mcleod_ideafix的答案提供了GNU find的(非标准) -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 \)

至于什么不行

  • 诸如s find . -perm 700命令find . -perm 700 find . -perm 700find . -perm 600 find . -perm 600 只会匹配具有该确切模式的文件700转换为u=rwx,go=600u=rw,go= ),因此您必须为用户和组权限的所有可能的变体构造命令找到所有兴趣匹配。
  • find . -perm -or find . -perm -or从根本上被打破并且总是匹配任何文件或者目录
    • 传递给-perm的值的前缀指定在匹配文件中设置后面的所有权限。
    • -perm只允许正确的权限匹配(设置的是什么,而不是未设置的),所以从根本上不可能只用一个-perm参数来表示“仅在没有设置权限的情况下匹配”。
      • 虽然-r语法上是受支持的(因为它是有效的chmod语法),但是在这里没有任何意义 ,并导致一个无操作。
      • 从技术上讲, -or告诉-perm从用于匹配的模式掩码的起始值中减去 (除去)“其他”的读取许可位; 因为那个起始值是000 ,或者象征性地a= ,所以任何试图从中减去权限的尝试都是没有操作的,即没有任何作用。 把它放在比利·普雷斯顿和布鲁斯·费舍尔的不朽的话语中: 没有什么'没有什么'
      • 最终效果是对潜在的匹配文件或目录的权限没有任何限制所有项目都是无条件匹配的。
    • 因此, 唯一的选择是让-perm 本身匹配( -perm -o=r ),然后通过放置find的否定运算符否定结果! ,之前。