如何列出目前連接到特定連接埠的所有唯一 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,但它可能會更冗長。

相關內容