我有一个脚本可以捕获数据包并输出链接到新发现的 IP 的 2 位国家/地区代码。
我想监控每个国家/地区的数据包数量,并在数据包捕获期间以连续方式执行此操作。
的输出uniq -c
正是我所需要的,但我希望它随着时间的推移而改变,并在读取管道的输出时更新。
这是我的脚本:
#!/bin/bash
ngrep |grep -oE "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | while read i
do
whois $i | grep -i 'Country' | sed 's/Country:[ ]*//I'
done
答案1
您意识到对于通过网络接口的每个数据包,您至少发出两个whois
请求(因此发送更多数据包并在某处加载一个或多个 whois 服务器)?
在这里,我假设tshark
IP 地址地理定位数据库已安装并正确配置:
tshark -lq -T fields -e ip.geoip.src_country -e ip.geoip.dst_country |
gawk -F '\t' -v clear="$(tput clear)" '
BEGIN{PROCINFO["sorted_in"] = "@ind_str_asc"}
{
count[$1 ? $1 : "Unknown"]++
count[$2 ? $2 : "Unknown"]++
printf "%s", clear
for (c in count)
printf "%5d %s\n", count[c], c
}'
答案2
你可以使用watch
:
./your_script > countries.txt
watch "sort countries.txt | uniq -c"
为了加快你可以做的事情:
./your_script | awk '{seen[$0]++;
for(c in seen) printf("%s:%d ", c,seen[c]); printf("\n")}' >countries.txt
watch "tail -n 1 countries.txt | tr ' ' '\n'"
whois
顺便说一句,你可以尝试代替geoiplookup
。