The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"shell-скрипт для подсчета трафика"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"shell-скрипт для подсчета трафика"  
Сообщение от GHopper email on 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 - все, что у меня есть! Думаю такую задачу можно решить стандартными средствами.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


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

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "shell-скрипт для подсчета трафика"  
Сообщение от GHopper email on 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"

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "shell-скрипт для подсчета трафика"  
Сообщение от madskull (ok) on 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"

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "shell-скрипт для подсчета трафика"  
Сообщение от Keeper email(??) on 28-Ноя-06, 16:06 
Имхо такие вещи было бы проще на перле писать.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру