Извлечение IP-адресов с минимум 3 разговорами в среде * Nix - PullRequest
2 голосов
/ 28 января 2011

Как видно на рисунке, у нас есть список IP-адресов (обратите внимание, что 128.3. * И 131.243. *) Находятся внутри нашей подсети. Мы предпочитаем делать это на Perl, любые другие хорошие идеи приветствуются в среде * nix.

Фотографии отформатированы как:

IP-адрес назначения (отсортировано) - Dest_Port - IP источника - Source_Port

пробел используется в качестве разделителя.

Мы делали это вручную, но знаем, что у нас огромные файлы и хотим автоматизировать эту процедуру.

Проблема в том, что нам нужно получить IP-адреса назначения ( не в нашей подсети , не 128.3. * и 131.243. *), которые общались как минимум с 3 разными IP-адреса (источник) внутри нашей подсети (128,3. * И 131,243. *).

enter image description here

В качестве примера 117.72.15.207 связывается (не ip подсети) по крайней мере с 3 различными адресами источника в нашей подсети (131.243.92.10, 131.243.92.117 и 131.243.92.191). Обратите внимание, что он связывается с 131.243.92.117 более чем одним с разными адресами портов источника, поэтому он будет учитывать только один адрес источника в выходных данных. я поставил звездочку, чтобы указать условие. нам нужен список IP-пар, которые удовлетворяют этому условию

59.69.194.12 80 131.243.93.74 4492
59.79.35.247 80 131.243.94.123 1307
59.100.23.87 80 131.243.92.72 45577
*117.72.15.207 80 *131.243.92.10 451 
*117.72.15.207 80 *131.243.92.117 21071
117.72.15.207 80 131.243.92.117 21072
117.72.15.207 80 131.243.92.117 21073
*117.72.15.207 80 *131.243.92.191 9248

Вывод будет:

117.72.15.207 80 131.243.92.10 451 
117.72.15.207 80 131.243.92.117 21071
117.72.15.207 80 131.243.92.191 9248

Пожалуйста, прокомментируйте, если что-то неясно. Спасибо ...

1 Ответ

1 голос
/ 29 января 2011
#!/usr/bin/env perl

use strict;

my %ip_lookup;
while (<DATA>) {
    my ($dest_ip, $dest_port, $source_ip, $source_port) = (split ('\s+', $_));
    $ip_lookup{$dest_ip}{$source_ip} = $_ unless $ip_lookup{$dest_ip}{$source_ip};
}

for my $dest_ip (keys %ip_lookup) {
    if (scalar(keys %{$ip_lookup{$dest_ip}}) >= 3) {
        print $_ for sort values %{$ip_lookup{$dest_ip}};
    }
}

__DATA__
9.69.194.12 80 131.243.93.74 4492
59.79.35.247 80 131.243.94.123 1307
59.100.23.87 80 131.243.92.72 45577
117.72.15.207 80 131.243.92.10 451 
117.72.15.207 80 131.243.92.117 21071
117.72.15.207 80 131.243.92.117 21072
117.72.15.207 80 131.243.92.117 21073
117.72.15.207 80 131.243.92.191 9248

Есть несколько способов сделать это в Perl, но пример, который я разместил выше, легко объяснить.

Сначала он читает каждую строку файла (я использую дескриптор DATA, но он будет работать с файлом), а затем разбивает строку, чтобы получить различные комбинации ip, port.

Затем он заполняет многоуровневый хэш, если только эта комбинация ip адресата-источника не была замечена ранее (указанная вами точка различия портов.)было сделано для каждого IP-адреса назначения, распечатывая строку, если это правда.

Это приводит к выводу:

117.72.15.207 80 131.243.92.10 451 
117.72.15.207 80 131.243.92.117 21071
117.72.15.207 80 131.243.92.191 9248

, что вам и нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...