我正在尝试修改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
答案 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
另请注意,我在文件名周围添加了引号。如果文件名中有空格,这有助于防止出现问题。