Wie liste ich alle eindeutigen IP-Adressen auf, die aktuell mit einem bestimmten Port verbunden sind?

Wie liste ich alle eindeutigen IP-Adressen auf, die aktuell mit einem bestimmten Port verbunden sind?

Angenommen, ich möchte wissen, wie viele einzelne Clients mit Port 5222 auf einem Server verbunden sind.

Können Sie einen besseren/schnelleren/stärkeren Weg finden?

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

Ich weiß, dass dies ein zu einfacher regulärer Ausdruck für eine Internetadresse ist, aber es scheint unnötig, auf wohlgeformte Adressen zu prüfen, da netstat wahrscheinlich nur gültige ausgibt.

Kann jemand zu einem kommen netstat -nt | awk { awesomeness }?

Ein netstat -nt | awk { simplicity }| uniq | wc -l, vielleicht?

Antwort1

Wenn Sie Linux verwenden und mit ssder Installation von Folgendem zurechtkommen:

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

Wenn Sie eine Erklärung zu AKW möchten, lassen Sie es mich einfach wissen.

Antwort2

So listen Sie alle eindeutigen IP-Adressen auf, die aktuell mit einem bestimmten Port verbunden sind:

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

Antwort3

Legen Sie den richtigen Feldtrenner fest und verwenden Sie dann die in awk integrierte Regex-Übereinstimmung, um Greps loszuwerden. Hier ist die Version mit Weiterleitung der Ausgabe an Uniq. Meiner Meinung nach besteht kein wirklicher Bedarf, Uniq vollständig durch etwas awk-Code zu ersetzen, da es weniger einfach und weniger unixartig wird.

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

Es ist jedoch nicht viel komplizierter und sieht als Einzeiler immer noch ganz ok aus:

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

Antwort4

Versuche dies:

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

Natürlich wäre es auch möglich, Uniq und WC in Awk auszuführen, aber das wäre wahrscheinlich ausführlicher.

verwandte Informationen