递归查找不可公开读取的文件
Recursively find files that are not publicly readable
我想递归地查找我的 public_html
文件夹中所有不可公开读取的文件(即那些会导致 403 错误的文件)。有一个快速的 bash 命令吗?如果相关的话,我正在使用 Linux 服务器 运行 apache。谢谢
使用find
命令:
find . ! -perm -o=r
将在当前目录和具有文件权限的子目录中搜索文件,以便 "others" 组无法读取该文件。
find
的手册页提供了这些选项的一些示例。
您可以 运行 作为 www-data
用户执行此命令:
find . ! -readable
查找 Web 服务器不可读的所有文件。
注意:这个答案最初是在 仍然包含以下 broken 命令时写的:find . -perm -o-r
;这个答案的最后一部分解释了为什么它不能工作。
find . ! -perm -o=r
- 匹配当前目录子树中的所有文件和目录 (
.
)
- 要将匹配限制为仅 文件 ,请附加
-type f
.
- 不 (
!
) 为安全主体设置了 read 权限 (r
) "others (world)" (o
)
只要检查的所有文件既不是由网络服务器 运行 在其上下文中的用户帐户创建的,也不属于网络服务器帐户 所在的组,这将按预期工作是的成员。
通常情况就是这样。
上述 命令是 POSIX-compliant.
提供 更强大的选项 可用于 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 700
和 find . -perm 600
之类的命令将只匹配 完全 [=119] 的文件=] mode(700
转换为 u=rwx,go=
,600
转换为 u=rw,go=
),因此您必须为用户构建所有可能的命令和组权限以查找所有感兴趣的匹配项。
find . -perm -o-r
从根本上被破坏并且 总是匹配 任何 文件或目录 :
- 传递给
-perm
的值的 -
前缀指定匹配文件中的所有后续权限 set。
-perm
只允许 positive 匹配权限(已设置的与未设置的相对),因此 根本无法表达"match only if this permission is NOT set" 只有一个 -perm
参数的逻辑 只有 .
- 虽然
-r
在语法上 受支持(因为它是有效的 chmod
语法),但它 毫无意义 此处并导致无操作。
- 技术上,
-o-r
告诉 -perm
减去 (移除)"others" 的读取许可位用于匹配的模式掩码;由于该起始值是 000
,或者象征性地是 a=
,任何从中减去权限的尝试都将是空操作,即无效。用 Billy Preston 和 Bruce Fisher 的不朽名言来说:Nothin' from nothin' leaves nothin'
- 最终效果是对可能匹配的文件或目录的权限没有任何限制,因此所有项无条件匹配。
- 因此,唯一的选择是让
-perm
自身匹配肯定(-perm -o=r
), 然后 取反 结果,方法是将 find
的取反运算符 !
放在它前面。
我想递归地查找我的 public_html
文件夹中所有不可公开读取的文件(即那些会导致 403 错误的文件)。有一个快速的 bash 命令吗?如果相关的话,我正在使用 Linux 服务器 运行 apache。谢谢
使用find
命令:
find . ! -perm -o=r
将在当前目录和具有文件权限的子目录中搜索文件,以便 "others" 组无法读取该文件。
find
的手册页提供了这些选项的一些示例。
您可以 运行 作为 www-data
用户执行此命令:
find . ! -readable
查找 Web 服务器不可读的所有文件。
注意:这个答案最初是在 find . -perm -o-r
;这个答案的最后一部分解释了为什么它不能工作。
find . ! -perm -o=r
- 匹配当前目录子树中的所有文件和目录 (
.
)- 要将匹配限制为仅 文件 ,请附加
-type f
.
- 要将匹配限制为仅 文件 ,请附加
- 不 (
!
) 为安全主体设置了 read 权限 (r
) "others (world)" (o
)
只要检查的所有文件既不是由网络服务器 运行 在其上下文中的用户帐户创建的,也不属于网络服务器帐户 所在的组,这将按预期工作是的成员。 通常情况就是这样。
上述 命令是 POSIX-compliant.
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 700
和find . -perm 600
之类的命令将只匹配 完全 [=119] 的文件=] mode(700
转换为u=rwx,go=
,600
转换为u=rw,go=
),因此您必须为用户构建所有可能的命令和组权限以查找所有感兴趣的匹配项。 find . -perm -o-r
从根本上被破坏并且 总是匹配 任何 文件或目录 :- 传递给
-perm
的值的-
前缀指定匹配文件中的所有后续权限 set。 -perm
只允许 positive 匹配权限(已设置的与未设置的相对),因此 根本无法表达"match only if this permission is NOT set" 只有一个-perm
参数的逻辑 只有 .- 虽然
-r
在语法上 受支持(因为它是有效的chmod
语法),但它 毫无意义 此处并导致无操作。 - 技术上,
-o-r
告诉-perm
减去 (移除)"others" 的读取许可位用于匹配的模式掩码;由于该起始值是000
,或者象征性地是a=
,任何从中减去权限的尝试都将是空操作,即无效。用 Billy Preston 和 Bruce Fisher 的不朽名言来说:Nothin' from nothin' leaves nothin' - 最终效果是对可能匹配的文件或目录的权限没有任何限制,因此所有项无条件匹配。
- 虽然
- 因此,唯一的选择是让
-perm
自身匹配肯定(-perm -o=r
), 然后 取反 结果,方法是将find
的取反运算符!
放在它前面。
- 传递给