是否有任何有用的命令组合(sed / grep / find等)我可以用来检测.php文件不是以评论开头? 我当然可以写一个小脚本,但我宁愿使用shell命令。
匹配模式:
<?php /*
我想要search文件的内容,而不是文件名。
我必须处理一个被黑客入侵的网站,其中代码注入遵循一定的模式。
<?php $code.... /*
要么
<?php $code.... /*
使用gnu grep
你可以使用这个递归搜索:
grep -rvlz $'^[[:space:]]*<?php\n/\*' --include='*.php'
这将检测所有以php标签开头的php文件;
find ./ -iname '*.php' | xargs head -v -n 1 | grep -B 1 '<?php'
-B 1
:在比赛前保留1行,以便得到文件名。 这是快速和肮脏的,你可以看中,使输出更好,或使其更加强大。
awk
是你的朋友:
find /your/path/here -type f -iname "*.php" -exec \ awk 'FNR==2{if($0~/^\/\*/){print FILENAME};exit}' {} \;
笔记
{}
是通过find
传递给awk
的参数。 FILENAME
包含当前正在处理的文件 $0~/^\/\*/
在第二行的开头搜索/*
FNR==2
外观选择要处理的记录号, exit
用于处理所需记录后退出awk。 从shell中可以使用这个小awk脚本来查看文件是否不是以注释开始的:
awk 'NR==2 && f$0!="<?php/*"{print FILENAME}NR>2{exit 1}{f=$0}' file.php
要递归地将脚本应用于目录,请使用:
find -name '*.php' \ -exec awk 'NR==2 && f$0!="<?php/*"{print FILENAME}NR>2{exit 1}{f=$0}' {} \;
可能的空格是对上述解决方案的一个限制,但是通过在与<php?/*
比较之前删除所有可能的空格,
用于查找文件的UNIX工具是非常恰当的命名find
,UNIX工具对通用目的的文本操作是awk
:
find . -name '*.php' -print | xargs awk -v RS='^$' 'index($0,"<?php\n/*")==1{print FILENAME}'
以上使用的是GNU awk for multi-char RS。 我们使用index()来强制执行一个字符串而不是正则表达式搜索,因为你的目标字符串包含多个正则表达式元字符,所以这使我们避免了所有这些。