¿Cómo enumerar todas las direcciones IP únicas actualmente conectadas a un puerto específico?

¿Cómo enumerar todas las direcciones IP únicas actualmente conectadas a un puerto específico?

Digamos que quiero saber cuántos clientes únicos están conectados al puerto 5222 en un servidor.

¿Puedes encontrar una manera mejor/más rápida/más fuerte que esta?

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

Sé que esta es una expresión regular demasiado simple para una dirección de Internet, pero parece innecesario verificar si hay direcciones bien formadas, ya que netstat probablemente solo generará direcciones válidas.

¿Alguien puede venir a una netstat -nt | awk { awesomeness }?

¿Un netstat -nt | awk { simplicity }| uniq | wc -l, tal vez?

Respuesta1

Si estás en Linux y puedes soportar tener ssinstalado:

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

Si desea que le expliquemos el awk, hágamelo saber.

Respuesta2

Para enumerar todas las direcciones IP únicas actualmente conectadas a un puerto específico:

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

Respuesta3

Establezca el separador de campo adecuado, luego use la coincidencia de expresiones regulares incorporada de awk para deshacerse de los greps. Aquí está la versión con salida de tubería a uniq. En mi opinión, no hay una necesidad real de reemplazar completamente uniq con algún código awk, porque se vuelve menos simple y 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

Pero no es mucho más complicado y todavía se ve bien en una sola línea:

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

Respuesta4

Prueba esto:

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

Por supuesto, también sería posible hacer uniq y wc en awk, pero probablemente sería más detallado.

información relacionada