nixp.ru v3.0

18 октября 2017,
среда,
19:51:00 MSK

DevOps с компанией «Флант»
chelovek1 написал 26 июня 2009 года в 14:37 (487 просмотров) Ведет себя неопределенно; открыл 1 тему в форуме, оставил 1 комментарий на сайте.

Здравствуйте.

Проблема следующая. Мой хостинг взломали и в куче файлов добавили какой-то дурацкий код с iframe. После некоторых экспериментов с коммандами grep и sed, мне удалось вычистить этот вредоносный код.

Проблема в том, что во многих файлах код был вставлен внутрь закрывающего тега
, поэтому сечас в этих файлах тег разорван, т.е мы имеем что-то типа:

</</p>

body>

или

dy>

или еще несколько похожих комбинаций.

Я, к сожалению, очень мало понимаю в UNIX, поэтому никак не могу составить выражение, которое бы находило все нужные случаи.

«</[^>][:space:]$]+[^>]>» или «</[body]{0,4}[:space:]$]+[body]{0,4}>» это то что мне кажется должно соответствовать моему фрагменту, но не работает, значит я идиот. Помогите, пожалуйста, я как-то туплю и ничего не могу придумать.

Заранее большое всем спасибо

Дмитрий Шурупов

У sed/grep и т.п. есть некоторые хитрости при работе с многострочностью. Поскольку я люблю perl и у меня хорошее настроение…

shurup@ubuntop:~$ cat a.txt
</
body>
или
</bo
dy>
shurup@ubuntop:~$ cat a.pl
#!/usr/bin/perl -W
use strict;
my ($file, $content);
my @files = @ARGV;
while ($#files >= 0) {
  $file = shift(@files);
  print "Working with $file... ";
  if (open(R, $file)) {
    $content = '';
    $content .= $_ while();
    close(R);
  }
  if ($content) {
    $content =~ s/<\s*(\/)\s*(b)\s*(o)\s*(d)\s*(y)\s*>/<$1$2$3$4$5>/g;
    if (open(W, '>'.$file)) {
      print W $content;
      close(W);
      print "Something has been replaced! ";
    }
  }
  print "ok.\n";
}
shurup@ubuntop:~$ perl a.pl a.txt
Working with a.txt... Something has been replaced! ok.
shurup@ubuntop:~$

Надеюсь, суть понятна :-) (Скрипту можно через пробел передавать сразу кучку файлов: «perl a.pl a.txt b.txt dir/c.txt». Если в них нет проблемных
, изменяться файлы не будут и во время работы скрипта для них не выведется сообщение «Something has been replaced!».)

Перед запуском на всякий случай настоятельно рекомендую сделать backup. Мало ли чего…

Дмитрий Шурупов

P.S. Про хитрости многострочной работы sed — см. http://docstore.mik.ua/orelly/unix/sedawk/ch06_01.htm

chelovek1

Огромное спасибо за помощь!