Будучи большим поклонником изучения основ перед тем, как приступить к более сложным проектам, я задаю этот вопрос со вздохом и покачивая головой ... Мне нравится контролировать входящие / исходящие соединения в реальном времени (netstat -natuec), но иногда меня ловят в том, что я делаю ... Итак, я хотел бы создать сценарий, который добавлял бы любой НОВЫЙ IP-адрес, который появляется из команды netstat, в текстовый файл для просмотра позже. Я не прошу простого ответа, просто подсказку, с чего бы я начал. БЛАГОДАРНОСТЬ!

1
Nathaniel Davidson 28 Фев 2015 в 11:27

2 ответа

Лучший ответ

Не совсем bash, но perl, но он делает то, что вы хотите, вот весь сценарий:

use warnings;
use strict;
use Socket;
use feature 'say';

sub hex_to_ip {my $i = shift; inet_ntoa( pack( "N", hex( $i ) ) )}
sub addresses {open(my $net,"<","/proc/net/tcp"); my %add;while(<$net>) {my $r = (split " ",$_)[2];$r =~ s/(rem.*|:.*)//; $add{hex_to_ip($r)}++}; return %add};

my %old;
while(1) {
open(my $new_file,">>","/tmp/new_connections.txt");
my %fresh = &addresses;
for my $f(keys %fresh) {
    my $current_time = localtime;
    say $new_file "$f $current_time\n" unless exists $old{$f};
}
close $new_file;
say "!!"; %old = %fresh; sleep 2;
}

Функция для преобразования шестнадцатеричного в ip

sub hex_to_ip {my $i = shift; inet_ntoa( pack( "N", hex( $i ) ) )} 

Возвращает все удаленные адреса, найденные в "/ proc / net / tcp"

sub addresses {open(my $net,"<","/proc/net/tcp"); 
   my %add;while(<$net>) {my $r = (split " ",$_)[2];
   $r =~ s/(rem.*|:.*)//; $add{hex_to_ip($r)}++}; return %add
 } 

Открывает файл для добавления (не затирает то, что в нем)

open(my $new_file,">>","/tmp/new_connections.txt"); 

Работает всю жизнь программы

while(1)

Получает новую копию текущих адресов и, если в $ old их нет, записывает в файл с отметкой времени. (Поскольку $ old не заполняется с первой попытки, он запишет все адреса в первом цикле) и спит в течение двух секунд.

 my %fresh = &addresses;
for my $f(keys %fresh) {
    my $current_time = localtime;
    say $new_file "$f $current_time" unless exists $old{$f};
}
say "!!"; %old = %fresh; sleep 2;

}

1
salparadise 28 Фев 2015 в 10:49

1.exec netstat и получите IP-адрес
2.grep ip result.txt
3. если этого ip нет, напишите этот, иначе нет.

Вы можете crontab выполнить свой скрипт.

0
michael_stackof 28 Фев 2015 в 08:37