linux16:网络信息收集脚本练习:按照状态筛选tcp连接,筛选链接数量top10的端口号

要求

1.筛选出tcp地址,按照状态进行计数,分类展示

  • time_wait
  • established

2.按照同一个端口号连接的ip数量进行从高到低排序列出top10

3.输出top10端口对应的远程ip地址;端口之间以分割线分割,IP地址之间以逗号分割


解答

#!/bin/bash
#name:/tmp/daxiong/netlook.sh

echo ""
date
echo ""

echo "-----------------------------------------------------------"
echo "PART 1"
echo ""
#状态为TIME_WAIT的连接数量
declare -i tw=$(netstat -ant |grep -w tcp|grep -w TIME_WAIT|wc -l)
#状态为ESTABLISHED的连接数量
declare -i est=$(netstat -ant |grep -w tcp|grep -w ESTABLISHED|wc -l)
echo "TIME_WAIT_num=${tw}"      
echo "ESTABLISHED_num=${est}"
echo ""
#筛选出tcp连接的,且状态为TIME_WAIT的连接
netstat -ant |grep -w tcp|grep -w TIME_WAIT
echo ""
#筛选出tcp连接的,且状态为ESTABLISHED的连接
netstat -ant |grep -w tcp|grep -w ESTABLISHED


echo "-----------------------------------------------------------"
echo "PART 2 "
echo ""
#列出网络情况|从第三行开始显示|分割出第四字段|分割出第二块(端口号)|去除空行|排序|去重并计数|取前10|再次排序,按字段一(链接数量),-r表示逆序(默认是升序)
netstat -ant |awk 'NR>2' |awk '{print $4}'|cut -d ':' -f 2|grep -v '^$'|sort|uniq -c|head -n 10| sort -k 1 -r
echo ""


echo "-----------------------------------------------------------"
echo "PART 3 "
echo ""
#列出网络情况|从第三行开始显示|分割出第四字段|分割出第二块(端口号)|去除空行|排序|去重并计数|取前10|再次排序|分割出第二字段(排序后的端口号)
netstat -ant |awk 'NR>2' |awk '{print $4}'|cut -d ':' -f 2|grep -v '^$'|sort|uniq -c|head -n 10|sort -k 1 -r | awk '{print $2}'>/tmp/port.txt

#用for循环依次按行读出,并查询对应端口号的ip地址列出来
for line in $(cat /tmp/port.txt)
do
echo ""
echo  "=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+"
echo "Port: $line"
#列出网络情况|按照端口号抓取行|分割出第五字段(外域地址)|分割出第一块(外机ip)|去除空行|排序|去重|将换行符转换为逗号
netstat -ant |grep $line|awk '{print $5}'|cut -d ':' -f 1|grep -v '^$'|sort|uniq|tr "\n" ","
done

脚本问题分析:

1.指令过长,需要精简指令

2.在part1展示时,内容过度,建议设计交互式菜单

3.能力提升
shell属于初级脚本
后期可以尝试学习python,perl等

你可能感兴趣的:(Linux小白进阶,网络,tcp/ip,linux)