试着写一个脚本来清理

时间:2012-04-12 20:12:42

标签: bash

我正在尝试修改bash脚本,以从大量文件中删除大量恶意代码。

社区将从中受益,所以这里是:

#!/bin/bash

grep -r -l 'var createDocumentFragm' /home/user/Desktop/infected_site/* > /home/user/Desktop/filelist.txt

for i in $(cat /home/user/Desktop/filelist.txt)
do
   cp -f $i $i.bak
done

for i in $(cat /home/user/Desktop/filelist.txt)
do
   $i | sed 's/createDocumentFragm.*//g' > $i.awk
   awk '/<\/SCRIPT>/{p=1;print}/<\/script>/{p=0}!p'

这是脚本用以下消息轰炸出来的地方:

+ for i in '$(cat /home/user/Desktop/filelist.txt)'    
+ sed 's/createDocumentFragm.*//g'    
+ /home/user/Desktop/infected_site/index.htm    

我收到2个错误,脚本停止了。

/home/user/Desktop/infected_site/index.htm: line 1: syntax error near unexpected token `<'    
/home/user/Desktop/infected_site/index.htm: line 1: `<html><head><script>(function (){ '    

我完成了前两部分。

包含createDocumentfragm的文件已在文本文件中正确枚举。

textfile.txt中的文件已被复制,在原始位置添加了.bak IE:infected_site / some_directory / infected_file.htm和infected_file.htm.bak 有效地确保我们有备份。

我现在需要做的就是编写一个AWK命令,它将使用filelist.txt中的文件列表,将整个恶意文本全部用作模式,并将其从文件中删除。仅使用大写脚本作为起点,小写脚本过于通用,可以删除合法文本

我怀疑这可能对我有所帮助,但我不知道如何正确使用它。

http://backreference.org/2010/03/13/safely-escape-variables-in-awk/

一旦我找到了这个部分,并且在你确认文件没有被破坏之后你可以这样做来清除bak文件:

for i in $(cat /home/user/Desktop/filelist.txt)
do
   rm -f $i.bak
done    

1 个答案:

答案 0 :(得分:2)

有几件事:

你有:

$i | sed 's/var createDocumentFragm.*//g' > $i.awk

你应该这意味着(使用我们稍后会谈到的cat):

cat $i | sed 's/var createDocumentFragm.*//g' > $i.awk

您将文件列表中的每个文件视为命令而不是文件。

现在,您使用cat。如果您使用cat几乎可以将多个文件连接在一起,那么您可能正在做一些不太正确的事情。例如,您可以这样做:

sed 's/var createDocumentFragm.*//g' "$i" > $i.awk

我对awk声明也有点困惑。究竟是什么文件你使用awk?您的awk语句正在使用STDIN和STDOUT,因此它从for循环中读取文件名,然后在屏幕上打印输出。 sed语句是否可以提供给awk语句?

请注意,我不必将文件打印到STDOUT,然后将其输入sed。 sed命令可以直接获取文件名。

您还希望避免for遍历文件列表。这是非常低效的,并且可能导致命令行过载的问题。今天不是一个大问题,但是当你最不怀疑它时会影响你。发生的事情是$(cat /home/user/Desktop/filelist.txt)必须先执行才能for循环开始。

稍微改写一下你的程序:

cd ~/Desktop
grep -r -l 'var createDocumentFragm' infected_site/* > filelist.txt

while read file
do
     cp -f "$file" "$file.bak"
     sed 's/var createDocumentFragm.*//g' "$file" > "$i.awk"
     awk '/<\/SCRIPT>/{p=1;print}/<\/script>/{p=0}!p'
done < filelist.txt

我们可以使用一个循环,我们使它成为一个while循环。我甚至可以将grep提供给while循环:

grep -r -l 'var createDocumentFragm' infected_site/* | while read file
do
     cp -f "$file" "$file.bak"
     sed 's/var createDocumentFragm.*//g' "$file" > "$i.awk"
     awk '/<\/SCRIPT>/{p=1;print}/<\/script>/{p=0}!p'
done < filelist.txt

然后我甚至不必创建临时文件。

让我知道awk正在发生什么。我怀疑你想要这样的东西:

grep -r -l 'var createDocumentFragm' infected_site/* | while read file
do
     cp -f "$file" "$file.bak"
     sed 's/var createDocumentFragm.*//g' "$file" \
         | awk '/<\/SCRIPT>/{p=1;print}/<\/script>/{p=0}!p' > "$i.awk"
done < filelist.txt

另请注意,我在文件名周围添加了引号。如果文件名中有空格,这有助于防止出现问题。