使用一系列TCP端口计算连接数的脚本

时间:2012-10-10 21:02:56

标签: tcp awk grep ports connection

我使用以下脚本来计算特定范围的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秒。

我正在寻找改进性能的建议以及示例脚本。

3 个答案:

答案 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。用作端口分隔符。

其余的大致相同。

谢谢你的榜样!