2012-03-27 2 views
-2

У меня есть сайты, на которых были атакованы и заражены вредоносными программами.Linux найти файлы со строкой и заменить

Есть 800+ файлов, которые необходимо обновить, и строка будет точно такой же в каждом файле.

Что я хочу сделать, это найти все файлы, в которых есть вредоносное ПО, а затем удалить строку-нарушитель из файла.

Я нашел несколько сценариев командной строки, которые работают нормально при испытании на основной строке:

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

и при объединении в команду найти:

находке. -тип f | xargs grep 'string_to_find' -sl | xargs perl -pi -w -e 's/string_to_find // g;'

Теперь моя проблема заключается в получении, что для работы на строке, которая является чрезвычайно длинной и и сложной строкой:

<?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;} ?> 

Теперь, когда я пытаюсь поиск и замены с полной строкой (спасаясь всеми специальными символов) я получаю этот результат:

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. 

можно ли делать то, что я пытаюсь сделать, или это строка невозможно захватить? Нужно ли мне избегать символа @ по-другому? (Я бежал с \ и что не работает)

Любая помощь - я новичок с Баш и Perl

+0

Вопросы и ответы http://learn.perl.org/faq/perlfaq6.html#How-can-I-quote-a-variable-to-use-in-a-regex- – daxim

+0

спасибо daxim - не знаю хочу узнать perl –

ответ

0

Я понял. Утверждение было правильным, я просто пропустил бегство от некоторых персонажей.

Таким образом, в ответ на мой вопрос, ответ:

Да - метод, используемый правильно и работает в достижении желаемого результата Да - символ @ также должны быть экранированы

Побег строку правильно, и инструкция работает нормально.

0

Вы, вероятно, хотите, чтобы отступить к командной строке и использовать sed. Он построен именно для такого типа проблем. Вот хорошее место, чтобы начать: IBM Developerworks SED by example

+0

попробовал sed - он сказал, что строка слишком длинная –

1

\@ должен работать, но у вас есть и другие проблемы: <? соответствует дополнительному <, например, не последовательность <?. Согласно man perlre, следующее должно работать:

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

\Q выключает все специальные значения регулярных выражений, что позволяет искать точную строку, не цитируя все метасимволы. \ E временно восстанавливает специальный смысл, но поскольку @ изолирован, он не интерпретируется как начало имени массива. Вам придется окружать каждый @ и $ таким же образом. И тогда, конечно, убедитесь, что это работает правильно! Удачи.

Редактировать: По правде говоря, я бы порекомендовал заменить ваш однострочный шрифт простым скриптом. Определите строку, которую вы хотите найти, чтобы не было никакой ненужной замены переменных (распечатайте ее, чтобы убедиться); отключите все специальные символы с помощью quotemeta(), чтобы отключить их значение регулярного выражения; и применить к входу. Вот если строка действительно ТОЧНО такая же; если «random_string ...» отличается от места к месту, вам нужно более тщательно создать свой RE. В любом случае это упростит вашу жизнь, если вы напишете 5-строчный скрипт perl, запустите его для работы над одним файлом, а затем примените метод find/xargs, чтобы применить его повсюду.

+0

, так что я могу просто окружить всю строку \ Q ... \ E? кроме одного случая @ –

+0

Нет, вы не можете. '' 'Нужно экранировать тоже. См. Справочную страницу. – alexis

0

Регулярные выражения имеют другие функции, облегчающие эту задачу.Если вы не имеете никакого действительного кода с переменными, которые начинаются с $evalfYl, то вы можете использовать более простое регулярное выражение, с меньшими затратами, чтобы избежать:

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

где .*? будет соответствовать любым символам до следующего появления " }?> "в строке.

+0

Хорошо, но это не имело бы значения, если бы я сделал это, потому что ему должно предшествовать @error_reporting (0) ... в любом случае, не так ли? Кроме того, вы избежали @, поэтому мне нужно избежать этого в perl? –

 Смежные вопросы

  • Нет связанных вопросов^_^