2017-10-04 4 views
0

J'ouvre une nouvelle question depuis que ma réponse d'origine a été répondue et je ne veux pas changer de sujet.Alerte de script de shell si les connexions arrivent avec le même IP/Port

Je suis en train de surveiller plusieurs connexions à venir en deux ports distincts mais avec le même

de IP

Exemple

netstat -an |grep 000 
101.101.101.101:2000  ESTABLISHED 
101.101.101.101:2000  ESTABLISHED 
101.101.101.102:3000  ESTABLISHED 
101.101.101.102:3000  ESTABLISHED 
101.101.101.102:3000  ESTABLISHED 
101.101.101.102:3000  ESTABLISHED 

Ce que je suis en train de faire est nestat et awk pour imprimer la colonne 1 et si 1001.1001.1001.1001: 200 n'est pas dans la sortie 2 fois que l'alerte signifiant si on descend encore alerte que 10.1001.1001.1001 est manquant une connexion

et aussi si 10.1001.1001.102: 3000 ne s'imprime pas exactement 4 fois alerte même si elle existe 3 ti mes dans la sortie netstat:

Voici mon code actuel qui est tout bon, sauf la propriété intellectuelle n'a qu'à exister une fois pour l'alerte à ne pas manquer:

connections=('101.101.101.101' '101.101.101.102') 
running=($(netstat -an |grep 000 |awk '{print $1}')) 
non_running=() 
for process_name in ${connections[@]}; do 
    if [[ "${running[*]}" == *$process_name* ]]; then 
     echo "$process_name is running" 
    else 
     echo "$process_name is not running" 
    fi 
done 

Répondre

0

Je ne suis pas encore tout à fait clair sur la exigences. Vous appelez le premier champ $process_name mais dans votre sortie netstat ce serait la combinaison addr: port. La sortie réelle sur Linux et BSD a le protocole comme premier champ. En outre, vous semblez chercher seulement des connexions établies mais vous employez le commutateur -a de netstat qui lui fait imprimer des douilles d'écoute, aussi?

Donc, en supposant que votre résultat ressemble au-dessus, je ferais comme ça en Perl:

#!/usr/bin/perl 
use strict; 
use warnings; 

my %minimum = (
    '101.101.101.101:2000' => 2, 
    '101.101.101.102:3000' => 5, 
); 
my %count; 

open my $fh, '-|', 'netstat -an' or die "could not run netstat: $!"; 
while(<$fh>) { 
    next unless /^([0-9.]+:\d+000) /; 
    $count{$1}++; 
} 
close $fh; 

while(my ($ip_port, $min) = each %minimum) { 
    $count{$ip_port} ||= 0; 
    next if $count{$ip_port} >= $min; 
    print "$ip_port: need $min connections, found only $count{$ip_port}\n"; 
} 

Vous aurez probablement à adapter l'expression régulière dans la boucle de lecture. J'utiliserais netstat -tpn pour obtenir des connexions TCP actives et des noms de processus, sa sortie ressemble à ceci:

tcp  0  0 172.30.252.100:39056 52.216.18.58:80   ESTABLISHED 2000/chrome   
+0

Merci @mbethke! J'ai essayé d'exécuter sur mon système et d'obtenir les erreurs ci-dessous: 'Utilisation de la valeur non initialisée en numérique ge (> =) à perlconnections.pl ligne 19. Utilisation de la valeur non initialisée dans la concaténation (.) Ou chaîne à perlconnections.pl ligne 20. 101.101.101.101:2000: besoin de 2 connexions, trouvé seulement Utilisation de la valeur non initialisée en numérique ge (> =) à perlconnections.pl ligne 19. Utilisation de la valeur non initialisée en concaténation (.) ou chaîne à perlconnections. pl ligne 20. 101.101.101.102:3000: besoin de 5 connexions, trouvé seulement – connollyc4

+0

vous avez raison, je ne cherche que des connexions établies donc -un n'est pas nécessaire. Dans mon environnement actuel, je suis à la recherche du quatrième domaine. Je viens de le mettre en premier pour simplifier la question. Mon netstat ressemble à la vôtre: tcp 0 0 172.30.252.100:39056 52.216.18.58:80 ESTABLISHED 2000/chrome '' – connollyc4

+0

Vous avez raison, je n'avais pas considéré le cas quand il n'y avait pas de connexions du tout. J'ai ajouté une ligne pour me prémunir contre cela. – mbethke