如何列出当前连接到特定端口的所有唯一 IP 地址?

如何列出当前连接到特定端口的所有唯一 IP 地址?

假设我想知道有多少唯一客户端连接到服务器上的端口 5222。

你能找到比这更好/更快/更强的方法吗?

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

我知道这对于互联网地址来说是一个过于简单的正则表达式,但似乎没有必要检查格式正确的地址,因为 netstat 可能只会输出有效的地址。

有人可以来吗netstat -nt | awk { awesomeness }

一个netstat -nt | awk { simplicity }| uniq | wc -l,也许?

答案1

如果您使用的是 Linux 并且可以ss安装:

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

如果您想解释 awk,请告诉我。

答案2

列出当前连接到特定端口的所有唯一 IP 地址:

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

答案3

设置正确的字段分隔符,然后使用 awk 内置正则表达式匹配来摆脱 grep。这是通过管道输出到 uniq 的版本。 IMO,没有真正需要用一些 awk 代码完全替换 uniq,因为它变得不那么简单,也更少 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

但它并没有变得更复杂,而且看起来仍然可以作为一行:

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

答案4

尝试这个:

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

当然,也可以在 awk 中执行 uniq 和 wc,但它可能会更冗长。

相关内容