2012-03-27 8 views
-2

Ich habe einige Websites, die angegriffen und mit Malware infiziert wurden.Linux finde Dateien mit String und ersetzen

Es gibt mehr als 800 Dateien, die aktualisiert werden müssen, und die Zeichenfolge ist in jeder Datei genau gleich.

Ich möchte alle Dateien finden, die die Malware enthalten, und dann die fehlerhafte Zeichenfolge aus der Datei löschen.

Ich habe einige Kommandozeilen-Skripte gefunden, die gut funktionieren, wenn sie auf einem Grund Zeichenfolge getestet:

perl -pi -w -e 's/string_to_find//g;' test-file.php 

und wenn sie in den find-Befehl kombiniert:

Fund. -type f | xargs grep 'string_to_find' -sl | xargs perl -pi -w -e's/string_to_find // g; '

Jetzt ist mein Problem, dass immer auf die Saite zu arbeiten, die eine extrem lange und komplexe Zeichenfolge ist:

<?php @error_reporting(0); if (!isset($eva1fYlbakBcVSir)) {$eva1fYlbakBcVSir = "random_string_7365_characters_long";$eva1tYlbakBcVSir = "string_of_encoded_characters";$eva1tYldakBcVSir = "string_of_encoded_characters";$eva1tYldakBoVS1r = "string_of_encoded_characters";$eva1tYidokBoVSjr = "string_of_encoded_characters";$eva1tYldokBcVSjr=$eva1tYldakBcVSir($eva1tYldakBoVS1r);$eva1tYldakBcVSjr=$eva1tYldakBcVSir($eva1tYlbakBcVSir);$eva1tYidakBcVSjr = $eva1tYldakBcVSjr(chr(2687.5*0.016), $eva1fYlbakBcVSir);$eva1tYXdakAcVSjr = $eva1tYidakBcVSjr[0.031*0.061];$eva1tYidokBcVSjr = $eva1tYldakBcVSjr(chr(3625*0.016), $eva1tYidokBoVSjr);$eva1tYldokBcVSjr($eva1tYidokBcVSjr[0.016*(7812.5*0.016)],$eva1tYidokBcVSjr[62.5*0.016],$eva1tYldakBcVSir($eva1tYidokBcVSjr[0.061*0.031]));$eva1tYldakBcVSir = "";$eva1tYldakBoVS1r = $eva1tYlbakBcVSir.$eva1tYlbakBcVSir;$eva1tYidokBoVSjr = $eva1tYlbakBcVSir;$eva1tYldakBcVSir = "string_of_encoded_characters";$eva1tYlbakBcVSir = "string_of_encoded_characters";$eva1tYldakBoVS1r = "string_of_encoded_characters";$eva1tYldakBcVSir = "";$eva1tYldakBoVS1r = $eva1tYlbakBcVSir.$eva1tYlbakBcVSir;$eva1tYidokBoVSjr = $eva1tYlbakBcVSir;} ?> 

Nun, wenn ich die Suche und ersetzen mit dem vollständigen Zeichenfolge versuchen (Flucht in den besonderen Zeichen) ich dieses Ergebnis:

Possible unintended interpolation of @error_reporting in string at -e line 1. 
Name "main::error_reporting" used only once: possible typo at -e line 1. 

ist es möglich, zu tun, was ich versuche, die Zeichenfolge unmöglich zu erfassen zu tun oder ist? Muss ich das @ -Symbol anders entgehen? (Ich entkam mit einem \ und das hat nicht funktioniert)

Jede Hilfe - Ich bin ein Anfänger mit bash und perl

+0

FAQ http://learn.perl.org/faq/perlfaq6.html#How-can-I-quote-a-variable-in-use-in-a-regex- – daxim

+0

danke Daxim - ich nicht will lernen perl –

Antwort

0

Ich fand es heraus. Die Aussage war richtig, ich hatte gerade einige Charaktere vermisst.

So in der Antwort auf meine Frage, die Antwort lautet:

Ja - die verwendete Methode ist korrekt und arbeitet in das gewünschte Ergebnis zu erzielen Ja - Das @ -Zeichen muss auch

Entfliehen Sie den String entwertet wird richtig und die Aussage funktioniert gut.

0

Sie wahrscheinlich auf die Kommandozeile sichern wollen und sed verwenden. Es ist genau für diese Art von Problem gebaut. Hier ist ein guter Ort, um zu beginnen: IBM Developerworks SED by example

+0

versuchte sed - es sagte die string war zu lang –

1

Die \@ funktionieren sollte, aber Sie haben andere Probleme zu bekommen: <? passt ein optionales < zum Beispiel nicht die Sequenz <?. Nach man perlre, sollte folgende funktionieren:

perl -pi -w -e 's/\Q<?php \[email protected]\Qerror_reporting...//g' 

Die \Q schaltet alle Sonder regexp Bedeutungen ab, so dass Sie für eine exakte Zeichenfolge suchen, ohne jeden metacharacter zu zitieren. Das \ E stellt die spezielle Bedeutung vorübergehend wieder her, aber da @ isoliert ist, wird es nicht als Anfang eines Array-Namens interpretiert. Sie müssen alle @ und $ auf die gleiche Weise umgeben. Und dann überprüfe natürlich, ob das richtig funktioniert! Viel Glück.

Edit: In Wahrheit würde ich empfehlen, ersetzen Sie Ihre Einzeiler mit einem einfachen Skript. Definieren Sie die Zeichenfolge, nach der Sie suchen möchten, und stellen Sie sicher, dass keine unerwünschte Variablensubstitution auftritt (drucken Sie sie aus, um sicherzustellen, dass sie nicht verändert wird). Deaktivieren Sie alle Sonderzeichen mit quotemeta(), um ihre Bedeutung für reguläre Ausdrücke zu deaktivieren. und auf die Eingabe anwenden. Das ist, wenn die Zeichenfolge wirklich GENAU identisch ist; Wenn sich der "random_string ..." von Ort zu Ort unterscheidet, müssen Sie Ihren RE sorgfältiger zusammenstellen. In jedem Fall wird es Ihnen das Leben leichter machen, wenn Sie ein 5-zeiliges Perl-Skript schreiben, es in einer Datei bearbeiten und dann die find/xargs-Methode verwenden, um es überall anzuwenden.

+0

so kann ich nur die ganze string mit \ Q ... \ E umgeben? außer dem einen Vorkommen von @ –

+0

Nein, können Sie nicht. Die '$' müssen ebenfalls geflohen sein. Siehe die Manpage. – alexis

0

Reguläre Ausdrücke haben andere Funktionen, die diese Aufgabe erleichtern könnten.Wenn Sie keinen gültigen Code mit Variablen, die mit $evalfYl beginnen, dann kann man einen viel einfacheren regulären Ausdruck mit weniger verwenden zu entkommen:

perl -pi -w -e \ 
's/<\?php \@error_reporting\(0\);if \(!isset(\$evalYl.*?} \?>//g' \ 
test-file.php 

wo .*? werden alle Zeichen Übereinstimmen bis zum nächsten Auftreten von " }?> "in der Zeichenfolge.

+0

Ok, aber es wäre sowieso egal, wenn ich es tun würde, weil vorher @error_reporting (0) vorausgehen müsste ... wie auch immer, nicht wahr? Du bist auch dem @ entkommen, also muss ich das in Perl entkommen? –