终端命令删除多个文件 - CPanel,共享主机感染病毒

Command in terminal to delete multiple files - CPanel, shared hosting infected with virus

今天,Hosted gator 报告说我的共享主机上有 30K 个文件被感染。大约 25K 是同一个文件,多次。我通过终端一次性删除了它们:

find . -name "0x1337.php" -delete

参考:
Delete large batch of files with same file name in different directories - cpanel/LAMP

一个这样的示例路径是:

/home1/..../public_html/.........com/wp-includes/js/tinymce/skins/lightgray/fonts/0x1337.php: SL-PHP-BACKDOOR-GENERIC-md5-cavg.UNOFFICIAL FOUND

还剩下大约 6K:

/home1/.../public_html/......com/blog/wp-content/plugins/related-posts-slider/styles/.htaccess: SL-HTACCESS-GENERIC-xo.UNOFFICIAL FOUND

如果我用这个删除:

find . -name ".htaccess" -delete → 所有.htaccess将被删除。 是否有重构以便只能删除受感染的文件?

这个可以当线索吗→-xo.UNOFFICIAL FOUND?

为了阐明我在评论中提到的步骤,我将全部写在这里。

我要超级在这里详细解释发生了什么。

我的假设是 Hostgator 为您提供了一个名为 malware.txt 的文件,其中包含如下所示的条目:

/path/to/file.php: SOME-MALWARE FOUND
/path/to/another/file.php: SOME-OTHER-MALWARE FOUND
/path/to/clean/file.php: CLEAN

换句话说:malware.txt 混合了被标记为包含恶意软件的文件和被认为干净且您想要保留的文件。

第一步是将这个文件变成一个只包含文件路径的新文件。为此,我们将使用 grepcut

grep 'SOME-MALWARE' malware.txt | cut -d ':' -f1 > filelist.txt
  • grep 'SOME-MALWARE' malware.txt 将在 malware.txt 中的任何位置找到包含字符串 SOME-MALWARE 的所有行。这是有目的的,因此您可以将列表分解为更小的集合并一次针对单个恶意软件。
  • | 将每行发送到下一个命令
  • cut -d ':' -f1 将用分隔符 (:) 分隔每一行并仅保留给定的字段 (1 -- 第一个字段,所以从行首开始的所有内容到第一个 : 个字符)
  • > filelist.txt 会将结果发送到 filelist.txt

现在,有了样本集,filelist.txt 应该包含以下内容:

/path/to/file.php

(目标 /path/to/another/file.php 更改 grep 以寻找 SOME-OTHER-MALWARE

下一步是删除这些文件。为此,我们将使用 catrm。由于我们不能使用 | 直接传送到 rm,我们将使用 xargs 命令来做到这一点。

cat filelist.txt | xargs -n1 -p rm
  • cat filelist.txt 将逐行读取 filelist.txt 中的所有行
  • | 将每行发送到下一个命令
  • xargs -n1 -p rm 会将每一行作为参数发送给 rm 命令。
    • -n1 将确保它一次处理一行(如果没有这个,它将把多行组合成一个 rm 命令来一次删除多个文件)
    • -p 会在实际执行 rm 命令之前提示您确认是否要继续

-p 的原因是您可以验证这一切是否正常工作。确认后,您可以根据需要删除 -p 参数。

请注意,这假设您的所有文件名都非常基本。如果它们包含特殊字符或空格,则需要对其进行转义,否则会中断。

例如,如果您有一个名为 /path/to/some file.php 的文件,此代码将尝试删除文件 /path/to/somefile.php.

如果您发现这里有问题,您可以像这样调整 xargs 命令:

cat filelist.txt | xargs -I "{}" -n1 -p rm {}

-I "{}" 部分会将输入参数(来自 cat 的文件名)用双引号括起来,末尾的 {} 将确保 rm 使用包装参数而不是原始参数。

如果你多次运行这个命令,你可能会看到很多“找不到文件”的错误。对于上次您已删除的文件,这是预期的 运行,因此无需担心。

我希望这能澄清事情,如果有任何不清楚的地方,请告诉我。