Como monitorar continuamente o número de ocorrências que passam por um tubo

0

Eu tenho um script que captura pacotes e gera o código de país de 2 dígitos vinculado ao IP recém-encontrado.

Eu quero monitorar o número de pacotes para cada país e fazê-lo de forma contínua durante a captura de pacotes.

A saída de uniq -c é exatamente o que eu preciso, mas eu quero que isso mude com o tempo e atualize enquanto leio a saída do pipe.

Aqui está o meu script:

#!/bin/bash        
ngrep |grep -oE "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"  | while read i
    do
            whois $i | grep -i 'Country'  | sed 's/Country:[ ]*//I'

    done
    
por user123456 07.10.2016 / 00:17

2 respostas

2

Você percebe que está fazendo pelo menos dois whois de solicitações (enviando muito mais pacotes e carregando um ou mais whois sever em algum lugar) para cada pacote que passa pela sua interface de rede?

Aqui, eu usaria tshark supondo que o banco de dados de geolocalização de endereços IP esteja instalado e configurado corretamente:

tshark -lq -T fields -e ip.geoip.src_country -e ip.geoip.dst_country |
  gawk -F '\t' -v clear="$(tput clear)" '
  BEGIN{PROCINFO["sorted_in"] = "@ind_str_asc"}
  {
    count[$1 ? $1 : "Unknown"]++
    count[$2 ? $2 : "Unknown"]++
    printf "%s", clear
    for (c in count)
      printf "%5d %s\n", count[c], c
  }'
    
por 07.10.2016 / 10:30
2

Você pode usar watch :

./your_script > countries.txt
watch "sort countries.txt | uniq -c"

Para acelerar as coisas que você poderia fazer:

./your_script | awk '{seen[$0]++;
  for(c in seen) printf("%s:%d ", c,seen[c]); printf("\n")}' >countries.txt
watch "tail -n 1 countries.txt | tr ' ' '\n'"

BTW em vez de whois , você pode tentar geoiplookup .

    
por 07.10.2016 / 01:49

Tags