host de contagem de pipe do netstat

1

Problema do Unix pipe: como processar a entrada de múltiplas linhas para produzir a linha e inserir alguns processos canalizados.

echo "111 22222222" | awk '{print $1 " " $2 " " piped_processes_using_2nd_argument}'

Um pouco de contexto: netstat analisado para obter a lista de endereços IP externos conectados a $ current_ip, classificados de forma decrescente, por exemplo (caso não real):

$ netstat -plant |grep $current_ip | tr -s ' ' |cut -f5 -d' '|cut -f1 -d':' |sort -n |uniq -c |sort -nr
   7 8.8.8.8
   2 4.4.4.4
   1 186.2.168.190
   1 207.192.128.2

Até agora, inverta o DNS usando

$ host 4.4.4.4 | tr -s " " | rev  | cut -f1 -d " " |rev
alu7750testscr.xyz1.gblx.mgmt.Level3.net.

Destes, eu quero algo como (sim, mantendo o ip na saída):

   7 8.8.8.8 google-public-dns-a.google.com.
   2 4.4.4.4 alu7750testscr.xyz1.gblx.mgmt.Level3.net.
   1 186.2.168.190 ddos-guard.net.
   1 207.192.128.2 www.NexQloud.com.

Para mesclar estes, eu só poderia pensar em awk, mas como eu não sou fluente com isso, o resultado é muito feio:

netstat -plant |grep $current_ip | tr -s ' ' |cut -f5 -d' '|cut -f1 -d':' |sort -n |uniq -c |sort -nr  | awk '{ system("echo " $1 " " $2 " $(host "$2" | tr -s \" \" | rev  | cut -f1 -d \" \" |rev)") }' | sort -nr -k1

Eu quero algo mais elegante e rápido o suficiente para ser chamado em um relógio --interval = 1: -)

    
por nicolallias 15.07.2015 / 14:14

1 resposta

1

você gosta de | você?

o melhor que eu venho com

current_ip=$(ifconfig eth0 | awk '$1 == "inet" { split($2,A,":") ; print A[2] ; } ')

netstat -plant | grep $current_ip | awk '{split($5,A,":") ; howmany[A[1]]++ ; }
END { for (h in howmany) printf "%d %s \n",howmany[h],h ;} '|
 sort -nr |
while read hm ho
do
  name=$(host $ho|awk '{print $NF}')
  echo $hm $ho $name
done

onde

  • não há necessidade de escapar da nova linha, se o último caractere for um pipe
  • {split($5,A,":") ; howmany[A[1]]++ ; } lembra cada host e conta (após remover o número da porta)
  • END { for (h in howmany) printf "%d %s \n",howmany[h],h ;} no final do netstat, resultado da impressão
  • name=$(host $ho|awk '{print $NF}') gethostname do IP
  • use ${name%%.} para se livrar de terminar .
  • adicione current_ip

não tenho certeza se a minha solução é melhor de qualquer forma, só tenho 4 canais em vez de 12.

    
por 15.07.2015 / 14:59