2012-04-12 1 views
0

다수의 악성 코드를 제거하기 위해 bash 스크립트를 수정하려고합니다. 파일.복수의 htm 파일에서 <script.aa = ([]. slice + 'hjkbghkj')를 반복적으로 정리하는 스크립트를 작성하려고 시도합니다.

커뮤니티 그래서 여기있다,이 도움이됩니다 :

#!/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  

나는이 에러가 발생하고 스크립트가 중지됩니다.

/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 이 효과적으로 백업되었는지 확인합니다.

필자가해야 할 일은 filelist.txt에있는 파일 목록을 사용하고 전체 악성 텍스트 패턴을 패턴으로 사용하여 파일에서 제거하는 AWK 명령을 작성하는 것입니다. 대문자 스크립트를 시작점으로 사용하고 소문자 스크립트가 너무 일반적이고 합법적 인 텍스트를 삭제할 수 있습니다.

이것이 도움이 될 것으로 생각되지만 올바르게 사용하는 방법을 모르겠습니다.

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

나는이 부분을 파악하고이 파일을 사용하면 박 파일을 청소하기 위해이 작업을 수행 할 수 있습니다 엉망이되지 않았 음을 확인한 후에 일단 :

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

답변

2

몇 가지 :

당신은이 :

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

당신은 proba한다 BLY (우리가 순간에 대해 얘기하자있는 cat의 사용을 사용하여)이 의미 :이 명령 및 파일이 아닌 것처럼 당신은 당신의 파일 목록에서 각 파일을 치료하고

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

합니다.

이제 cat을 사용합니다. 거의 모든 것을 연결하기 위해 cat을 사용하고 있지만 여러 파일을 함께 연결하면 아마도 옳지 않은 것을하고있을 것입니다. 나는 또한 awk 문에 대해 조금 혼란 스러워요

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

예를 들어, 당신이 이것을 할 수 있었다. 정확히 awk를 사용하고있는 파일은 무엇입니까? awk 문은 STDIN 및 STDOUT을 사용하므로 for 루프에서 파일 이름을 읽은 다음 출력을 화면에 인쇄합니다. sed 문을 awk 문에 입력한다고 가정합니까?

STDOUT에 내 파일을 인쇄 한 다음 sed로 파이프 할 필요가 없습니다. sed 명령은 파일 이름을 직접 가져올 수 있습니다.

for의 파일 목록을 반복하지 않으려는 경우도 있습니다. 이는 매우 비효율적이며 명령 줄에 문제가 발생할 수 있습니다. 오늘 큰 문제는 아니지만 최소한 의심이 될 때 영향을 줄 수 있습니다. 무슨 일이 일어나면 for 루프가 시작되기 전에 $(cat /home/user/Desktop/filelist.txt)이 먼저 실행되어야합니다.

프로그램의 약간의 재 작성 :

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을 먹일 수도 있습니다 :

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 

참고 파일 이름 주위에 따옴표를 붙였습니다. 이렇게하면 파일 이름에 공백이 있으면 문제를 예방하는 데 도움이됩니다.

+0

다른 가능한 답변을 찾은 것 같습니다. [link] http://backreference.org/2010/03/13/safely-escape-variables-in-awk/ AWK에 ** 전체 악성 glob **, 안에 포함 된 모든 변수에 관계없이, 나는 안전하게 악성 텍스트를 제거 할 수 있어야합니다. 그래도 그런 스크립트를 만드는 데 필요한 기술이 부족합니다 ... ( –

+0

OP는 여기에 몇 가지 의견을 달았습니다 : http://stackoverflow.com/suggested-edits/239391 – Kevin

관련 문제