我使用以下脚本来计算特定范围的TCP端口的已建立连接数和时间等待状态。
该脚本使用netstat和egrep尝试过滤掉有效的连接。该脚本还从文件中读取输入并计算观察到的连接数。
#!/bin/bash
START=121
END=9089
[ -f /tmp/ports.txt ] && rm -f /tmp/ports.txt
for ((a=$START; a <= $END; a++)); do
netstat -an | nawk '/TIME_WAIT|ESTABLISHED/ && !/127.0.0.1/{split($4,a,".");print a[5]}' | egrep -c ^${a}$ | \
awk -v x=$a '\
$0 != 0 {printf("%d %d\n",x,$0)}' | tee -a /tmp/ports.txt
done
awk -v s=$START -v e=$END '\
BEGIN{t=0}
{t=t+$2}
END{printf("\nTotal Connections on ports %d-%d: %d\n",s,e,t)}' /tmp/ports.txt
rm -f /tmp/ports.txt
我正在寻找提高脚本性能的方法。使用当前的端口范围(121-9089),完成需要大约77秒。
我正在寻找改进性能的建议以及示例脚本。
答案 0 :(得分:2)
您正在运行netstat -an
超过8000次并且一次只提取一个端口。
我会用不同的逻辑改变你的主循环:
netstat -na | grep -E "TIME_WAIT|ESTABLISHED" | while read line; do
port=`echo $line | awk -F":" ' { print $2 }' | awk ' { print $1 }'` #<--- get here your port
[ $port -ge $START ] && [ $port -le $END ] && echo $line | tee -a /tmp/ports.txt #<---- put only the selected range
done
这样您只会netstat
一次。
请注意,您需要更改我示例中的awk
逻辑。
答案 1 :(得分:1)
一种方式:
netstat -an |
awk -v start=121 -v end=9089 '
$NF ~ /TIME_WAIT|ESTABLISHED/ && $4 !~ /127\.0\.0\.1/ {
split( $4, a, /:/ );
if ( a[2] >= start && a[2] <= end ) {
++connections;
}
}
END {
printf("\nTotal Connections on ports %d-%d: %d\n", start, end, connections );
}
'
答案 2 :(得分:1)
Birei,使用上面的例子,脚本略有改变。
#!/bin/bash
OS=$(uname)
case "$OS" in
'SunOS')
AWK=/usr/bin/nawk
;;
'Linux')
AWK=/bin/awk
;;
'AIX')
AWK=/usr/bin/awk
;;
esac
netstat -an | $AWK -v start=1 -v end=65535 ' $NF ~ /TIME_WAIT|ESTABLISHED/ && $4 !~ /127\.0\.0\.1/ {
if ($1 ~ /\./)
{sip=$1}
else {sip=$4}
if ( sip ~ /:/ )
{d=2}
else {d=5}
split( sip, a, /:|\./ )
if ( a[d] >= start && a[d] <= end ) {
++connections;
}
}
END {print connections}'
我们正在使用我们的网络监控工具。 (ZABBIX) 我已经使用solaris 10,Linux 6.3和AIX 7测试了该脚本,并且该脚本按预期工作,并考虑了netstat输出列的方式和deimeter字符的差异。 I.E.这个。或者:出现在第2列或第4列。它检查第一列是否包含a。并相应地设置变量sip,然后确定a:或a。用作端口分隔符。
其余的大致相同。
谢谢你的榜样!