Como listar todo endereço IP atualmente conectado a uma porta específica?

5

Digamos que eu queira saber quantos clientes exclusivos estão conectados à porta 5222 em um servidor.

Você consegue encontrar uma maneira melhor / mais rápida / mais strong do que isso?

netstat -nt | grep ':5222.*ESTABLISHED' | awk '{ print $5 }' \
| grep -Po '[0-9]{1,3}(\.[0-9]{1,3}){3}' | uniq | wc -l

Eu sei que este é um regex muito simples para um endereço de Internet, mas parece desnecessário verificar se há endereços bem formados, já que o netstat provavelmente produzirá apenas os válidos.

Alguém pode acessar um netstat -nt | awk { awesomeness } ?

A netstat -nt | awk { simplicity }| uniq | wc -l , talvez?

    
por motobói 10.04.2012 / 22:06

4 respostas

2

Se você estiver no Linux e puder processar ss instalado:

ss -o state established '( dport = :5222 )'|awk -F"[\t :]+" 'NR!=1{ ip[$5]+=1 } END{ for (i in ip){n++};print n }'

Se você gostaria que o awk explicasse, me avise.

    
por 11.04.2012 / 01:36
1

Defina o separador de campo adequado e, em seguida, use a correspondência de regex interna do awk para se livrar de greps. Aqui está a versão com saída de tubulação para uniq. IMO, não há necessidade real de substituir completamente o uniq por algum código awk, porque ele fica menos simples e menos unix-y.

netstat -nt  | gawk --re-interval -F':|[ ]+' '$7==5222 && $8=="ESTABLISHED" && $6 ~ /[0-9]{1,3}(\.[0-9]{1,3}){3}/{print $6}' | uniq

Mas não é muito mais complicado, e ainda parece ok: one-liner:

netstat -nt  | gawk --re-interval -F':|[ ]+' '$7==5222 && $8=="ESTABLISHED" && $6 ~ /[0-9]{1,3}(\.[0-9]{1,3}){3}/{a[$6]} END{for (i in a) print i}'
    
por 10.04.2012 / 22:53
1

Tente isto:

netstat -nt | awk '/:5222.*ESTABLISHED/ { split ($5, a, ":"); print a[1] }' | uniq | wc -l

Seria possível fazer o uniq e o wc no awk também, é claro, mas provavelmente seria mais detalhado.

    
por 10.04.2012 / 22:56
1

Para listar todos os endereços IP atualmente conectados a uma porta específica:

netstat -ntu | egrep ':80|:443' | grep -v LISTEN | awk '{print $5}' | cut -d\t -f5 | grep -Po '[0-9]{1,3}(\.[0-9]{1,3}){3}' | sort | uniq -c | sort -rn | grep -v 127.0.0.1
    
por 25.01.2017 / 06:15

Tags