Всем, Привет. Помогите парсером на Perl. Смысл такой. Я сканирую некий диапозон на открытый порт , предположим 3389. Иногда попадается такая защита , где по всей подсети провайдера идет положительный ответ , что мол порт открыт. тоесть получается список 194.13.63.12 94.64.13.82 198.13.95.1 198.13.95.2 198.13.95.3 198.13.95.4 198.13.95.5 .... 198.13.95.253 198.13.95.254 198.13.95.255 179.52.62.5 81.74.73.162 Тоесть некоторые провы сделали такого рода защиту. Люди помогите сделать такой парсер , где в случае если последний октет (байт) IPV4 повторяется, больше чем 10 раз подряд, то весь повторяющийся список удоляется из результата скана. Зарание спасибо .
а ты уверен что это провы? у меня такая фигня была изза файрволла, на любом IP любой порт был кагбы открыт у тебя не любой IP и всёже, если есть файрволл - выруби и попробуй без него
Бывает такого рода защита , как она делается не вдавался в подробности. Просто прошу сделать парсер , который удалит все не нужное по выше указанному алгоритму.
Люди добрые , ну сделайте скрипт на Perl . На PHP у меня есть, но он не работает. <?php $file = explode("\r\n",file_get_contents("in.txt")); $limit = 10; $start = 0; for($i=1;$i<=count($file);$i++) { $prev = explode(".",$file[$i-1]); $temp = explode(".",$file[$i]); if($prev[2]==$temp[2])$count++; else { if($count>$limit) { for($a=$start;$a<=($start+$count);$a++) { unset($file[$a]); } } $count = 0; $start = $i; } } file_put_contents("out.txt",implode("\r\n",$file)); ?> Чу, спасибо за участие. Не понимаю как с этим VBA справится, если заменить все точки, точкой-запятой, то мне кажется удалятся и нужные IP. Пробовал сканировать данные диапозоны на любые порты. Там как буд-то бы открыты все порты. Просто знаю , что Perl - это язык генерации отчетов и лучше его наверно никто не справится с поставленной задачей ,+ если еще файлы большие будут. Может кто знает , где можно попросить этот парсер сделать ? Ну где народ без особых затруднений и сложностей с этим справится ? ))
Вроде робит PHP: use strict; my $max_in_diapazon = 10; open(FILE,"in.txt");my @lines = <FILE>;close FILE; my %hashes=(); foreach(@lines) { chomp; my @line = split /\./, $_ ; my $hash = join ('.',$line[0],$line[1],$line[2]); $hashes{$hash}[++$#{ $hashes{$hash} }] = $line[3]; } foreach my $mask ( keys %hashes ) { foreach my $i ( 0 .. $#{ $hashes{$mask} } ) { my $line = join '.', $mask,$hashes{$mask}[$i]; } } open(FILE,">out.txt"); foreach my $mask ( keys %hashes ) { my $line; if($#{$hashes{$mask}} < $max_in_diapazon) { foreach my $i (0..$#{$hashes{$mask}}) { $line = join '.', $mask,$hashes{$mask}[$i]; print FILE $line,"\n"; } } else { $line = join '.', $mask,'###'; print FILE $line,"\n"; } } close FILE;
Запускаю на сервере UNIX , Apache + PHP. chmod +x pars.php сделал chmod 777 in.txt out.txt сделалю Запускаю через браузер , белый экран и ничего не происходит. Тогда пробую запустить с командно строки lynx pars.php Он выдает ;close FILE; my %hashes=(); foreach (@lines) { chomp; my @line = split /./, $_ ; my $hash = join ('.',$line[0],$line[1],$line[2]); $hashes{$hash}[++$#{ $hashes{$hash} }] = $line[3]; } foreach my $mask ( keys %hashes ) { foreach my $i ( 0 .. $#{ $hashes{$mask} } ) { my $line = join '.', $mask,$hashes{$mask}[$i]; } } open(FILE,">out.txt"); foreach my $mask ( keys %hashes ) { my $line; if($#{$hashes{$mask}} < $max_in_diapazon) { foreach my $i (0..$#{$hashes{$mask}}) { $line = join '.', $mask,$hashes{$mask}[$i]; print FILE $line,"\n"; } } else { $line = join '.', $mask,'###'; print FILE $line,"\n"; } } close FILE; ?> Не могу понять , в чем может быть дело ? P.S. Вот предположим список, который надо обработать.
Ааааааа , спасибо тебе наиогромнейшее . Ступил, тупо скопипастил, даже в код не вдумывался. Вот сейчас смотрю и понимаю , что да ... Переменные с операторами то перловские ))) Спс еще раз P.S. Сделал перловый скрипт . Он мне на выходе в файл OUT.txt Выдает такой результат: ...### Блин уже голову сломал , не пойму почему. Может в какой нить переменной пробел не верно стоит ?
Ага, в строке my @line = split /./, $_ ; съелся символ экранирования. Перед точкой надо поставить символ '\'(обраный слеш).
Если по маске встречаются X.Y.Z.1 X.Y.Z.2 X.Y.Z.3 X.Y.Z.10 X.Y.Z.50 X.Y.Z.240 и так более 10 раз, то они заменяются на X.Y.Z.### В начале кода есть переменная, которая это регулирует: Code: my $max_in_diapazon = 10;