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

Исходное сообщение
"shell-скрипт для подсчета трафика"

Отправлено GHopper , 26-Ноя-06 12:45 
Здравствуйте!
Я только начинаю знакомиться с ОС  FreeBSD. Поставил шлюз и теперь нужно организовать учет трафика для пользоватетелй сети. Решил задачу так:

rl1 - внешний интерфейс.
192.168.0.2 - пользователь из внутренней сети, который пользует интернет через шлюз
ipfw 10, 30 - правила count для трафика от пользователя 192.168.0.2 в интернет и обратно.
Трафик считается скриптом traffic (запускается с опереденным интервалом кроном), данные хранятся в файле /var/log/ipfw/count (структура такая: входящий трафик, исходящий, лимит трафика; все через пробел)

#traffic########################################
#!/bin/sh

clear
ipfw=`ipfw show 10`
ifconfig rl1 down
curout=`expr "$ipfw" : '.*\ .*\ \(.*\).*\ .*\ .*\ .*\ .*\ .*\ .*\ .*\ .*\ .*\ .*\ .*\ '`
ipfw zero 10
ipfw=`ipfw show 30`
curin=`expr "$ipfw" : '.*\ .*\ \(.*\).*\ .*\ .*\ .*\ .*\ .*\ .*\ .*\ .*\ .*\ .*\ .*\ '`
ipfw zero 30
ifconfig rl1 up
echo $curin,$curout

if [ $curin -eq 0 ] ; then
    echo curin is 0
    if [ $curout -eq 0 ] ; then
    echo curout is 0
    exit
    fi
fi

cat=`cat /var/log/ipfw/count`
totin=`expr "$cat" : '\(.*\)\ .*\ .*'`
totout=`expr "$cat" : '.*\ \(.*\)\ .*'`
balance=`expr "$cat" : '.*\ .*\ \(.*\)'`
echo $totin,$totout,$balance

#totin=`echo $curin+$totin | bc`
totin=`expr $curin + $totin`
#totout=`echo $curout+$totout | bc`
totout=`expr $curout + $totout`
echo $totin,$totout

if [ $totin -gt $totout ] ; then
    lim=`expr $balance - $totin`
else
    lim=`expr $balance - $totout`
fi

if [ $lim -le 0 ] ; then
    ipfw add 9 deny ip from 192.168.0.2 to any out via rl1
    ipfw add 29 deny ip from any to 192.168.0.2 in via rl1
fi

echo $totin $totout $balance > /var/log/ipfw/count
################################################

#/var/log/ipfw/count############################
0 0 10000
################################################

Так вот. Все работает, но т.к. это мой ПЕРВЫЙ shell-скрипт, то тут, скорее всего, не обойтись без ошибок (я ведь тоже человек). Хотелось-бы, чтобы вы взгялнули на мое творение, высказали критику и рекомендации.
Вопросы:
1. Может-ли тут произойти какое-нибудь переполнение?
2. Как сделать, чтобы count имел следующий вид:
#comment
in:    0
out:   0
limit: 10000
Тоесть сделать можно, а вот как потом из него информацию доставать? Как в таком случае читать файл построчно?
3. Что будет происходить при shutdown -h now? Если трафик будет проподать, то как избавиться от этого момента?
4. Можно-ли ipfw заставить в лог помимо времени, ip, порта и др. писать еще и число байт для каждого пакета?
5. Какая запись предпочтительнее:
totin=`echo $curin+$totin | bc`
totin=`expr $curin + $totin`

P.S. Не хочу ставить других интерпритаторов, netams, ipacc и пр. /bin/sh - все, что у меня есть! Думаю такую задачу можно решить стандартными средствами.


Содержание

Сообщения в этом обсуждении
"shell-скрипт для подсчета трафика"
Отправлено GHopper , 26-Ноя-06 14:31 
и еще вопросец - как это все хранить не в байтах, а в Мб? С дробными частями шел не работает.
expr 60 / 1024 - будет ноль!

"shell-скрипт для подсчета трафика"
Отправлено konst , 26-Ноя-06 23:47 
>и еще вопросец - как это все хранить не в байтах, а
>в Мб? С дробными частями шел не работает.
>expr 60 / 1024 - будет ноль!

#echo 3/2 | bc -l
или
#echo -e "scale=2\n3/6" | bc -l


"shell-скрипт для подсчета трафика"
Отправлено GHopper , 27-Ноя-06 16:30 
>>и еще вопросец - как это все хранить не в байтах, а
>>в Мб? С дробными частями шел не работает.
>>expr 60 / 1024 - будет ноль!
>
>#echo 3/2 | bc -l
>или
>#echo -e "scale=2\n3/6" | bc -l


Тогда возникает другая проблема:

x1=1
x2=2
if [ $x1 -gt $x2 ] ; then
  echo $x1 greater $x2
else
  echo $x1 smaller $x2
fi

Выдаст "1 smaller 2", но если я поменяю x2=0.2 и выполню скрипт, то получу слудующий ответ: "[: 0.2: bad number\n 1 smaller 0.2"


"shell-скрипт для подсчета трафика"
Отправлено madskull , 27-Ноя-06 18:44 

>Тогда возникает другая проблема:
>
>x1=1
>x2=2
>if [ $x1 -gt $x2 ] ; then
>  echo $x1 greater $x2
>else
>  echo $x1 smaller $x2
>fi
>
>Выдаст "1 smaller 2", но если я поменяю x2=0.2 и выполню скрипт,
>то получу слудующий ответ: "[: 0.2: bad number\n 1 smaller 0.2"
>

ну подумай сам. Раз баш не хочет понимать дробные числа, значит надо опять bc использовать.
например, вот так:
[ $(echo "$x1 > $x2" | bc) -ne 0 ] && echo "$x1 greater $x2" || echo "$x1 smaller $x2"


"shell-скрипт для подсчета трафика"
Отправлено Keeper , 28-Ноя-06 16:06 
Имхо такие вещи было бы проще на перле писать.