Como listar todos os endereços IP exclusivos atualmente conectados a uma porta específica?

Como listar todos os endereços IP exclusivos atualmente conectados a uma porta específica?

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 forte que essa?

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 endereços bem formados, pois o netstat provavelmente produzirá apenas endereços válidos.

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

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

Responder1

Se você estiver no Linux e puder ssinstalar:

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

Se você quiser que o awk seja explicado, é só me avisar.

Responder2

Para listar todos os endereços IP exclusivos 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

Responder3

Defina o separador de campo adequado e use a correspondência de regex integrada do awk para se livrar do 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 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 bom como uma linha:

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}'

Responder4

Experimente isto:

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

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

informação relacionada