我正在寻找一个 linux 命令来扫描服务器上的所有可写目录并显示其中包含 .php 和 .html 文件的目录。
就像是:
find -type d -writable -exec find {} -iname '*.php' -o -iname '*.html' \;
10 倍!
答案1
只需将其替换-writable
为-perm
find -type d -perm -a=w -exec find {} -iname '*.php' -o -iname '*.html' \;
答案2
find
与uniq
一起使用sudo
:
find / -type f -iname '*.php' -execdir sudo -u #UID -- bash -c 'test -w ./ && pwd' ';' |uniq
将 UID 替换为不存在的用户 ID,因此test -w
只能从以下位置得到 true全部写权限。
答案3
对于严格高于 4.8.0 的 GNU 版本find
(截至 2021 年 11 月 8 日尚未发布),您可以执行以下操作:
find . -type d -perm -a=w -print0 |
LC_ALL=C find -file0-from - -mindepth 1 -maxdepth 1 \
'(' -iname '*.php' -o -iname '*.html' ')'
(在当前的开发版本中,find
如果第一个版本没有返回任何内容,则第二个会抱怨,这不理想。希望它能在发布之前得到修复。如果没有,您可以使用 moreutilsifne
来解决它)
-perm -a=w
选择为其w
设置了所有位的文件用户,团体和其他,但请注意,为了使这些目录可写,用户仍然需要能够到达那里,因此具有对通向那里的所有路径组件的搜索访问权限。另请注意,没有成员的组不可写入的目录仍可被视为全局可写,但不会在此处报告。
-writable
本身选择用户调用可写的文件find
(使用access()
系统调用,因此不仅仅考虑文件本身的权限)。
使用zsh
,您可以执行以下操作:
set -o extendedglob # best in ~/.zshrc
for d (**/*(ND/Ff[a+w])) print -rC1 -- $d/*.(#i)(php|html)(ND)