nixp.ru v3.0

17 января 2017,
вторник,
18:05:47 MSK

DevOps с компанией «Флант»
Аватар пользователя lexx
lexx написал 7 апреля 2008 года в 12:27 (353 просмотра) Ведет себя как мужчина; открыл 41 тему в форуме, оставил 143 комментария на сайте.

На самом деле скорее всего присутсвует неверное в корне понимание операторов Perl.

Нужно для начала разобраться в следующих веах:

1. В какой переменной хранится обрабатываемая строка

2. как работает оператор =~

3. как работает оператор m//

Example:

Обрабатываемая строка в переменной $line

if ($line =~ m/(\d+\.\d+\.\d+\.\d+).(\d+)/) {

$ipAddress = $1;

$port = $2;

print «$ipAddress:$port»;

} else {

print «Wrong line format, sorry :(»;

}

raba

Спасибо, за предложение, но я кажется справился вот так:

s/^.*fxp0: //;

s/ >//;

s/ .*//;

if ( m/(\d+\.\d+\.\d+\.\d+)/ != NULL ) { $ip =~ m/(\d+\.\d+\.\d+\.\d+)/; $ip = $1; } else { die «error read $!»; «exit(0)»; }

s/\d+\.\d+\.\d+\.\d+//;

if (s/\.// == «») { $port = «ECHO\n»; }

else { $port = $_;}

printf «$ip\t$port»;

lexx

Ты босс :)

Но проблема в твоем коде — его непонятность …

Так же просто пытаешься замочить муху из базуки …

raba

Можеть быть и так, не спорью, но как любой новичок, для меня пока важен результат, чтоб двигатся дальше и не терят время, а так работает и ето меня радует! Буду профи, буду усовершенствовать своего source.

Curu3MyHg

Как-то так покрасивше будет?

#!/usr/bin/perl -w
while ($fip = ) {
  if ( $fip =~ m/^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\.(\d{1,5})$/ ) {
     print "$1\t$2\n";
  }
}

Разбираешь вывод tcpdump’а ?

Если не нужны флаги и внутренности пакетов, можно сразу делать

tcpdump -nqti

разбирать будет ещё проще.

Правда, это под линукс. Фряхиного tcpdump’а под рукой нет, там по фряшной традиции могут быть другие опции и другой формат вывода. ;)

myst

tcpdump один на всех.

raba

Да, tcpdump разбираю,:) и по поводу етого стандартный перебор елементов в массиве, помогите найти ошибку — с логикой как бы все нормально, только синтаксис меня мучает всегда.: масив из 6 елементов, нужно так отсортировать чтоб небыло повторяющиеся елементов, и счетчик для вычисления количество попыток с одного и того-же IP , чтобы после перебора можно было отсортировать самые активные взломщики :) в начале списка, с количество попытки с их стороны.Код:

$v = 6; # всего записы в логах

@fin=();

for ($i=0;$i<$v;$i++) {

       for ($j=1;$j=$v;$j++) {

       $sum =0;

       $a = @arr[$i];

       $b = @arr[$j];

       if ($a eq $b) { $sum++; } else { $b = $a; @fin = print(«$sum\t$b») }

       }

}

print @fin;

Curu3MyHg
raba
Да, tcpdump разбираю,:) и по поводу етого стандартный перебор елементов в массиве, помогите найти ошибку — с логикой как бы все нормально, только синтаксис меня мучает всегда.: масив из 6 елементов, нужно так отсортировать чтоб небыло повторяющиеся елементов, и счетчик для вычисления количество попыток с одного и того-же IP , чтобы после перебора можно было отсортировать самые активные взломщики :) в начале списка, с количество попытки с их стороны.Код:

Ничего не понял..

Тебе надо сделать что-то аналогичное этому:

# tcpdump -nqti eth0 -c 100 <какое-то условие> | awk -F' ' '{print $2}' | awk -F'.' '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -r

?

raba

Спасибо,Curu3MyHg, да что-то такое, я как бы почти справился..только меня волнует следующий код, он рабочий только понят не могу почему последнее значение из файла не перебирается т.е как, могу, знаю где надо поправить, но когда поправляю код зцикливает  с ошибкой «Use of uninitialized value in numeric lt (<)…»

Сам код:

————————————-

$v=6

for ($i=0;$i<$v;$i++) {

       for ($j=1;$j<$v;$j++) {      # вот тут надо поправить на '=' только фиг…

        if (@arr[$i] < @arr[$j]) {  # ошибка ссылается на ето место

                    quit;   } else {

                           $b = @arr[$i];

                           @arr[$i] = @arr[$j];

                           @arr[$j] = $b;

                    }

        }

}

print @arr,«\n»;

metal
raba
код зцикливает с ошибкой «Use of uninitialized value in numeric lt (<)…»

Сам код:

if (@arr[$i] < @arr[$j]) {  # ошибка ссылается на ето место

У тебя в массиве не иницилизированное значение, скорее всего tcpdump при определенных условиях не выводит все столбцы для записей, а ты это не замечаешь. Поставь обычный print перед сравнением и сможешь понять в каких случаях это возникает.

raba

Спасибо всем за помощь. разобрался кажется и тепер все нормально. Беда была в Midnight Commander который поставлял мне невидимые знаки, который vi благополучно вычеслил! Тему можете закрывать!

ecobeingecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.