尝试查找和删除文本以修复WP恶意软件时,SSH命令无法正常工作


SSH command not working properly when trying to find & delete text to fix WP malware

不幸的是,我需要清理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