Есть скрипт для подсчета колличества активных соединений по некоторым
портам(сокетам) написаный под 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 $*`
fiNETSTATOUTPUT=`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
doneRESULTSTRING=`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Помогите пожалуйста, подскажите где, что и как подправить.
Заранее спасибо.
>Есть скрипт для подсчета колличества активных соединений по некоторым
>портам(сокетам) написаный под 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
doneP.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.
>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Спасибо огромное, то что нужно. Все работает.