一度に複数のファイルのテキストを見つけて削除するLinuxコマンド

一度に複数のファイルのテキストを見つけて削除するLinuxコマンド

私のウェブサイトはウイルスに感染しています。ウイルスは私のウェブサイト上のいくつかのファイルにこの行を追加しました。私の考えは、端末の唯一のコマンドを使用してこのテキスト行を削除することです。

「file-1.php」、「file-2.php」などのファイルを含む「my-folder」フォルダがあるとします。

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

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

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

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

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

できますか?

答え1

  1. 組み合わせて再帰的sedfindすることができます。このような:

    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 startから始めることができます)。これにより、ファイルに適用された変更を簡単にロールバック/転送できます。

答え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

file-1.php file-2.php file-n.phpに「for i」として必要なファイルを追加することもできます。

答え4

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

forループでファイルを参照できます。

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

関連情報