1

次のスクリプトを使用して、確立された接続の数と、特定の範囲の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秒かかります。

サンプルスクリプトとともに、パフォーマンスを改善するための提案を探しています。

4

3 に答える 3

2

netstat -an8000 回以上実行し、一度に 1 つのポートのみを抽出しています。

メインループを別のロジックで変更します。

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私の例ではロジックを変更する必要があることに注意してください。

于 2012-10-10T21:25:23.760 に答える
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 が列を出力する方法の違いと区切り文字の違いを説明しています。すなわち。または : が 2 列目または 4 列目に表示されます。最初の列に . それに応じて変数 sip を設定し、a : または a . ポート区切り文字として使用されます。

残りはほとんど同じです。

あなたの例をありがとう!

于 2012-10-12T15:55:53.490 に答える
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 ); 
    }
'
于 2012-10-10T21:26:06.867 に答える