不幸的是,我需要清理WordPress安装,这些安装受到插件或过时的恶意软件攻击,但是作为一个完全的SSH初学者,我发现很难确切地看到我做错了什么。
我需要删除的代码是这样的:
<?php $qiorgeq = '22)gj!|!*nbsbq%)323ldfidk! (...base64 text...) ?>
由于我需要从服务器上以 php 标签开头的所有文件中删除它,我认为这可以解决问题:
find -type f -name '*.php' -print0 | xargs -0 sed -i 's#<?php $qiorgeq*?>##g'
经过几次失败的尝试和许多错误后得出了这个结论。这似乎正在运行,但似乎什么也没做,也没有删除任何内容。
我觉得答案很接近...请帮忙!
这里有几件事:
find
find
的第一个参数应该是要搜索的目录。
例如:find . -type f -name *.php -print0
(注意find
和-name
之间的.
)
sed
默认情况下,sed 不会修改文件的内容。它将结果输出到标准输出。添加-i "myextension"
会将修改后的文件保存到yourfile.php.myextension
但仍然不会修改源文件。
要覆盖源文件,您需要做的是sed -i "" 's#search#replace#g
(在-i
选项后添加一个空字符串)
正则表达式您应该在sed
正则表达式中使用.*
而不是*
。(.
字符与任何字符匹配)。您当前的正则表达式将仅匹配 qiorge
+ 任意数量的q
。
最后,一个有效的命令是:
find . -type f -name '*.php' -print0 | xargs -0 sed -i "" 's#<?php $qiorgeq.*?>##g'
编辑 1:该命令适用于 Mac OS,但sed
可能在 Linux 上有所不同。
此命令可能适用于 Linux:find . -type f -name '*.php' -print0 | xargs -0 sed -i 's#<?php $qiorgeq.*?>##g'
(我删除了 -i
参数后面的空字符串)
编辑 2:
以下脚本将列出受感染的文件(适用于换行符,适用于包含空格的文件):
find . -iname "*.php" | while read f
do
if [[ "$( grep "<?php $qiorgeq" "$f" )" != "" ]] ; then
echo "$f"
fi
done
您可以通过所需的任何处理替换echo
。
单行:find . -iname "*.php" | while read f ; do if [[ "$( grep "<?php $qiorgeq" "$f" )" != "" ]] ; then echo $f ; fi ; done