0

多数のファイルから悪意のあるコードの塊を削除するために、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 (){ '    

最初の 2 つの部分を完了しました。

createDocumentfragm を含むファイルは、テキスト ファイルに正しく列挙されています。

textfile.txt 内のファイルが複製され、元の場所に .bak が追加されています。

あとは、filelist.txt 内のファイルのリストを使用する AWK コマンドを作成し、悪意のあるテキストの塊全体をパターンとして使用して、ファイルから削除するだけです。開始点として大文字のスクリプトのみを使用し、小文字のスクリプトは一般的すぎて正当なテキストを削除する可能性があります

これが役立つと思いますが、正しく使用する方法がわかりません。

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    

さらに良い選択は、ファクトリ オブジェクトを介して配置されたシングルトン Java コレクション ( map または list ) です。カートをそこに保管するだけで、データベースや設定をまったく気にする必要はありません

設定を使用する場合は、私の小さなデータバインディング ライブラリをお勧めします。

https://github.com/ko5tik/andject

4

1 に答える 1

2

いくつかのこと:

あなたが持っている:

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

あなたはおそらくこれを意味するべきです(catこれについては後で説明します):

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

ファイルリスト内の各ファイルを、ファイルではなくコマンドであるかのように扱っています。

さて、あなたの使用についてcatcat複数のファイルを連結する以外のほとんどの目的で使用している場合は、おそらく正しくないことを行っています。たとえば、次のようにすることができます。

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

私もそのawk声明について少し混乱しています。正確にどのファイルでawkを使用していますか?ステートメントはSTDINawkと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

1つのループを使用でき、それをwhileループにしました。その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

また、ファイル名を引用符で囲んでいることにも注意してください。これは、ファイル名にスペースが含まれている場合の問題を防ぐのに役立ちます。

于 2012-04-12T21:03:46.757 に答える