我正在尝试阻止有多个端口25连接(垃圾邮件)的IP
我有以下命令:
netstat -an|grep :25| awk {'print $4'} | cut -d: -f1 | sort | uniq -c | sort -n
产生如下输出:
1
1 127.0.0.1
2 185.11.11.11
10 185.11.11.22
20 185.11.11.33
50 185.11.11.44
我想只过滤第一列大于15的行。
谢谢
答案 0 :(得分:5)
如果您不需要连接总数而只需要IP列表,则此行将执行:
netstat -an | awk '$4~/:25/{gsub(":25","",$4); s[$4]++; if(s[$4]==15){print $4}}'
$4~/:25/
过滤包含':25' (相当于你队伍中的grep)
gsub(":25","",$4)
从IP地址(字段4)中删除端口号
s[$4]++
增加了给定IP的计数器
if(s[$4]==15){print $4}
打印IP
答案 1 :(得分:1)
netstat -an | awk 'BEGIN { PROCINFO["sorted_in"] = "@val_num_desc" }
$4 ~ /:25$/ && split($4, a, ":") == 2 {
seen[a[1]]++
}
END {
for (i in seen)
if (seen[i] > 15)
print seen[i], i
}'
可以处理大部分事情,因此可以避免这么多管道命令。您可以使用单个gnu-awk命令消除所有命令,如下所示:
PROCINFO["sorted_in"] = "@val_num_desc" # used for sorting an array by value
# in numerical descending order
split # used to get IP address by discarding port num
$4 ~ /:25$/ # to search a particular port in netstat output
解体:
public static void MsgToCode(string value)
{
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(value);
var sb = new StringBuilder();
foreach (var item in bytes)
{
sb.Append((Convert.ToInt32(item) + 2));
}
Console.WriteLine(sb.ToString());
Console.ReadLine();
}
答案 2 :(得分:0)
只需使用awk'$ 1> 15'追加管道:
netstat -an|grep :25| awk {'print $4'} | cut -d: -f1 | sort | uniq -c | sort -n | awk '$1>15'
答案 3 :(得分:0)
又一个答案。
netstat -nat | awk -F'[ :]+' '
BEGIN{PROCINFO["sorted_in"] = "@val_num_desc"}
$5 == "25" {count[$4]++}
END{
for (ip in count)
if (count[ip]>15)
print count[ip], ip
}
'
答案 4 :(得分:0)
命令netstat -an | head -n 4
在此处生成此输出:
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:715 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:2137 0.0.0.0:* LISTEN
这意味着第4个字段是“Local Adress”。我假设你想要的是“外国地址”(字段#5)列表。
此外,您显示的是版本4的IP地址。可能netstat -4an
对您来说效果更好。 IPv6地址应具有可变数量的:
。
清除这两个问题后,awk本身可以(几乎)完成所有工作:
netstat -4an |
awk ' $5 ~ /:25/ {split($5,a,/:/); c[a[1]]++;}
END{ for (ip in c) { if (c[ip] > 15) print(c[ip],ip) }; }
'|sort -n