URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 3527
[ Назад ]

Исходное сообщение
"Помогите подправить скрипт люди добрые"

Отправлено mbun , 28-Окт-04 08:13 
Есть скрипт для подсчета колличества активных соединений по некоторым
портам(сокетам) написаный под bash(не мной, но... времени нет), но почему-то
ничерта не работает, показывает одни нули.

Система FreeBSD 5.2.1, Bash3.

Вот сам скрипт:

#!/bin/bash
ARGLENGTH=`echo $* | wc -c | awk '{print $1}'`
if [ `echo $ARGLENGTH` -eq 1 ]; then
    SOCKETLIST=`echo "20 21 22 23 25 80 443 8080"`
else
    SOCKETLIST=`echo $*`
fi

NETSTATOUTPUT=`netstat -an | grep -v unix | awk '{print $4}' | awk -F: '{print $2}'`
RESULTSTRING=""

for socket in `echo $SOCKETLIST`; do
    counter=0
    for i in `echo -e $NETSTATOUTPUT`; do
        if [ $i -eq $socket ]; then
            counter=`expr $counter + 1`
        fi
    done

    RESULTSTRING=`echo -n $RESULTSTRING"unix_socket_"$socket":"$counter" "`
done
echo -n $RESULTSTRING

А вот формат в котором выдает информацию netstat -an

Active Internet connections (including servers)
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)
tcp4       0      0  192.168.??.??.51624    192.168.??.??.1080     ESTABLISHED
tcp4       0      0  192.168.??.??.1080     192.168.??.??.1183     TIME_WAIT

[skip]

tcp4       0      0  192.168.??.??.80       192.168.??.??.51621    TIME_WAIT
tcp4       0      0  192.168.??.??.51060    192.168.??.??.1080     ESTABLISHED
tcp4       0      0  *.21                   *.*                    LISTEN
tcp4       0      0  *.8080                 *.*                    LISTEN
tcp4       0      0  *.1080                 *.*                    LISTEN
tcp4       0      0  *.80                   *.*                    LISTEN
tcp4       0      0  127.0.0.1.49160        127.0.0.1.49161        ESTABLISHED
tcp4       0      0  127.0.0.1.53           *.*                    LISTEN
tcp4       0      0  192.168.??.??.53       *.*                    LISTEN
Active UNIX domain sockets
Address  Type   Recv-Q Send-Q    Inode     Conn     Refs  Nextref Addr
c6c62dac stream      0      0 c6c96514        0        0        0 /tmp/mysql.sock
c6c68000 stream      0      0 c6c71514        0        0        0 /var/run/ndc
c6c63460 dgram       0      0        0 c6c63000        0 c6c63b7c
c6c63b7c dgram       0      0        0 c6c63000        0 c6c63d20
c6c63d20 dgram       0      0        0 c6c63000        0 c6c62e38
c6c62e38 dgram       0      0        0 c6c63000        0 c6c63e38
c6c63e38 dgram       0      0        0 c6c63000        0 c6c68118
c6c68118 dgram       0      0        0 c6c63000        0        0
c6c63000 dgram       0      0 c6c34924        0 c6c63460        0 /var/run/log

Помогите пожалуйста, подскажите где, что и как подправить.

Заранее спасибо.


Содержание

Сообщения в этом обсуждении
"Помогите подправить скрипт люди добрые"
Отправлено Brainbug , 28-Окт-04 11:26 
>Есть скрипт для подсчета колличества активных соединений по некоторым
>портам(сокетам) написаный под bash(не мной, но... времени нет), но почему-то
>ничерта не работает, показывает одни нули.
>
>Система FreeBSD 5.2.1, Bash3.
>
>Вот сам скрипт:
>
>#!/bin/bash
>ARGLENGTH=`echo $* | wc -c | awk '{print $1}'`
>if [ `echo $ARGLENGTH` -eq 1 ]; then
> SOCKETLIST=`echo "20 21 22 23 25 80 443 8080"`
>else
> SOCKETLIST=`echo $*`
>fi
>
>NETSTATOUTPUT=`netstat -an | grep -v unix | awk '{print $4}' | awk
>-F: '{print $2}'`
>RESULTSTRING=""
>
>for socket in `echo $SOCKETLIST`; do
> counter=0
> for i in `echo -e $NETSTATOUTPUT`; do
>  if [ $i -eq $socket ]; then
>   counter=`expr $counter + 1`
>  fi
> done
>
> RESULTSTRING=`echo -n $RESULTSTRING"unix_socket_"$socket":"$counter" "`
>done
>echo -n $RESULTSTRING
>
>А вот формат в котором выдает информацию netstat -an
>
>Active Internet connections (including servers)
>Proto Recv-Q Send-Q  Local Address      
>   Foreign Address      
> (state)
>tcp4       0    
> 0  192.168.??.??.51624    192.168.??.??.1080    
> ESTABLISHED
>tcp4       0    
> 0  192.168.??.??.1080     192.168.??.??.1183  
>  TIME_WAIT
>
>[skip]
>
>tcp4       0    
> 0  192.168.??.??.80       192.168.??.??.51621
>   TIME_WAIT
>tcp4       0    
> 0  192.168.??.??.51060    192.168.??.??.1080    
> ESTABLISHED
>tcp4       0    
> 0  *.21        
>          
>*.*          
>         LISTEN
>tcp4       0    
> 0  *.8080        
>         *.*  
>          
>       LISTEN
>tcp4       0    
> 0  *.1080        
>         *.*  
>          
>       LISTEN
>tcp4       0    
> 0  *.80        
>          
>*.*          
>         LISTEN
>tcp4       0    
> 0  127.0.0.1.49160        
>127.0.0.1.49161        ESTABLISHED
>tcp4       0    
> 0  127.0.0.1.53        
>   *.*        
>          
> LISTEN
>tcp4       0    
> 0  192.168.??.??.53       *.*
>          
>        LISTEN
>Active UNIX domain sockets
>Address  Type   Recv-Q Send-Q    Inode  
>   Conn     Refs  Nextref
>Addr
>c6c62dac stream      0    
> 0 c6c96514        0
>       0    
>    0 /tmp/mysql.sock
>c6c68000 stream      0    
> 0 c6c71514        0
>       0    
>    0 /var/run/ndc
>c6c63460 dgram       0    
>  0        0
>c6c63000        0 c6c63b7c
>c6c63b7c dgram       0    
>  0        0
>c6c63000        0 c6c63d20
>c6c63d20 dgram       0    
>  0        0
>c6c63000        0 c6c62e38
>c6c62e38 dgram       0    
>  0        0
>c6c63000        0 c6c63e38
>c6c63e38 dgram       0    
>  0        0
>c6c63000        0 c6c68118
>c6c68118 dgram       0    
>  0        0
>c6c63000        0  
>     0
>c6c63000 dgram       0    
>  0 c6c34924        
>0 c6c63460        0 /var/run/log
>
>
>Помогите пожалуйста, подскажите где, что и как подправить.
>
>Заранее спасибо.

Moi variant (proboval dla 4.7-RELEASE FreeBSD):

#!/bin/sh

if [ -z "$*" ]; then
        SOCKETLIST="20 21 22 23 25 80 443 8080"
else
        SOCKETLIST="$*"
fi
NETSTATLIST=`netstat -anf inet|awk '{if($4~/[0-9]+/&& $0~/(ESTABLISHED)/){split($4,PORT,".");print PORT[5]}}'`
for socket in $SOCKETLIST; do
        counter=0
        for netstat in $NETSTATLIST; do
                if [ $netstat -eq $socket ];then
                        counter=`expr $counter + 1`
                fi
        done
        RESULTSTRING="$socket:$counter"
        echo $RESULTSTRING
done

P.S. script bil vidimo dla Linux napisan u4itivaja storku: awk -F: '{print $2}'` t.k. v BSD (pod rukoi tolko 4.7, 5.x k sozaleniju netu, a s golovi ne pomnu kak tam) dla otdelenije adresa ot porta v komande netstat ispolzujetca ".", a ne ":". Dumaju poetomu i ne rabotajet izna4alnij skript.


"Помогите подправить скрипт люди добрые"
Отправлено mbun , 29-Окт-04 11:12 
>Moi variant (proboval dla 4.7-RELEASE FreeBSD):
>
>#!/bin/sh
>
>if [ -z "$*" ]; then
>        SOCKETLIST="20 21 22 23
>25 80 443 8080"
>else
>        SOCKETLIST="$*"
>fi
>NETSTATLIST=`netstat -anf inet|awk '{if($4~/[0-9]+/&& $0~/(ESTABLISHED)/){split($4,PORT,".");print PORT[5]}}'`
>for socket in $SOCKETLIST; do
>        counter=0
>        for netstat in $NETSTATLIST;
>do
>            
>    if [ $netstat -eq $socket ];then
>            
>          
> counter=`expr $counter + 1`
>            
>    fi
>        done
>        RESULTSTRING="$socket:$counter"
>        echo $RESULTSTRING
>done

Спасибо огромное, то что нужно. Все работает.