Полезные скрипты наструганные на коленке.

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
Alex Keda
стреляли...
Сообщения: 34924
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Полезные скрипты наструганные на коленке.

Непрочитанное сообщение Alex Keda » 2007-04-16 11:08:07

Сабж. Думаю, у всех есть пачки таких скриптов...
Озадачился после случайного стирания пары нужных :)))
F.A.Q.
1. Сам скрипт в тегах [code]
2. Описание что делает, и указание - возможен ли запуск из крона (частенько, работающий от юзера скрипт из крона не запускается).
3. для вопросов - создавайте другие темы!
===============
Пароли и прочее заменяйте на абстрактные данные, типа exim_db/exim_user/exim_pass
Последний раз редактировалось Alex Keda 2007-04-16 20:42:09, всего редактировалось 1 раз.
Убей их всех! Бог потом рассортирует...

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Непрочитанное сообщение dikens3 » 2007-04-16 11:27:39

Речь только об Exim'овских скриптах я так полагаю?
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 34924
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2007-04-16 11:33:04

ну почему же - shell, наверно, преимущественно...
раздел то про юникса...
а вообще - думаю пригодится всё.
Убей их всех! Бог потом рассортирует...

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 34924
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2007-04-16 12:06:43

Код: Выделить всё

#!/bin/sh

# Временный файл
tmp_file="/tmp/trafd.traffic.$$.tmp"

# внешний ip машины
external_IP="`/sbin/ifconfig ed0 | grep inet | awk '{print $2}'`"

# Сегодяшний день
day="`date +%Y-%m-%d`"
# Текущий год
year="`date +%Y`"
# Текущий месяц
month="`date +%m`"
# Текущее время (секунды специально сделаны 00 - иногда cron запускает скрипт не
# в 00 секунд а позже (максимум что я видел - в 13), если машина очень загружена -
# как итог в логах начинает фигурировать разное число секунд.
# Мне это непонравилось :)
curr_time="`date +%H:%M:00`"
# Директория в которой будут храниться текстовые файлы с логами trafd
NewDir="/var/traffic/${year}/${month}"
# Пытаемся создать эту самую директорию на случай если это первый запуск
# или произошла смена месяца (года)
mkdir -p ${NewDir}
# Ну и топаем туда
cd ${NewDir}

# Считываем все переменные из файла /etc/rc.conf с целью извлечь оттуда
# строчку с названиями интерфейсов по которым работает trafd
# (У меня три сетевых платы и lo0 - просто интереса ради)
. /etc/rc.conf

# Для всех интерфейсов выковырнутых из rc.conf (висят в ${trafd_ifaces})
# выполняем один и тот же набор действий по разбору логов и запихиванию
# их в базу данных
for iface in ${trafd_ifaces}
do
# Сохраняем статистику по текущему интерфейсу
/usr/local/bin/trafsave ${iface}
# Преобразуем логи из двоичного в текстовый формат. Сохраняются они в
# папке /tmp в виде файлов summary.* c расширением по имени интерфейса
/usr/local/bin/traflog -i ${iface} -a -n -s > /tmp/summary.${iface} 2>/dev/null
# Очищаем файл с логами в двоичном формате
cat /dev/null > /usr/local/var/trafd/trafd.${iface}
# Дозаписываем логи в текстовый файл (пусть лежат на всякий случай...)
cat /tmp/summary.${iface} >> ${NewDir}/summary.${iface}

# проверяем интерфейс. Нам интересен лишь ed0
if [ ${iface} = 'ed0' ]
then
# Считаем траффик от нас. Считаем за весь месяц, кладём во временный
# файл - из него будет выводиться при логине - когда su делаешь
cat ${NewDir}/summary.${iface} | grep "^[0-9]" | grep "^${external_IP}"| awk '
        BEGIN { d=0 }
                {
                        # Суммируем 6-й столбец на вводе - траффик
                        d=$6+d
                }
        END {
                printf " %s \n",d
        } ' > ${tmp_file}
read bytes_out < ${tmp_file}

# Считаем траффик от нас. Считаем за весь месяц, кладём во временный
# файл - из него будет выводиться при логине - когда su делаешь
cat ${NewDir}/summary.${iface} | grep "^[0-9]" | grep -v "^${external_IP}"| awk '
        BEGIN { d=0 }
                {
                        # Суммируем 6-й столбец на вводе - траффик
                        d=$6+d
                }
        END     {
                        printf " %s \n",d
                } ' > ${tmp_file}
read bytes_in < ${tmp_file}

# заносим траффик во временный файл - будет выводиться на экран при логоне
# но вначале пересчитываем из байт в мегабаты.

echo " Траффик за этот месяц (пересчитывается каждые 10 минут):
 Входящий:      `expr ${bytes_in} / 1048576` Mb
 Исходящий:     `expr ${bytes_out} / 1048576` Mb" > /usr/local/var/trafd/tmp_data.txt

#echo ${bytes_in} ${bytes_out}
fi

done

# удаляем временный файл
rm ${tmp_file}

скрипт подсчёт траффика - используется на test.lissyara.su. Кроном - раз в 10 минут...
Убей их всех! Бог потом рассортирует...

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Непрочитанное сообщение dikens3 » 2007-04-16 12:09:31

Может пригодится кому, практически полная установка jail'a
Я пишу скрипты в папке /root/sсripts/* так что у меня и настройки в скрипте ссылаются туда же.
Скрипт поместить в папку /root/scripts/jail/
конфиги в /root/scripts/jail/conf
Для создания и удаления нужно исправить в скрипте путь к создаваему/удаляемому jail'у и запустить с параметрами create или remove.

myjail.sh

Код: Выделить всё

#!/bin/sh

jail_dir="/usr/local/jails/newmail"

case "$1" in
    create)
        cd /usr/src
        mkdir -p $jail_dir
        make world DESTDIR=$jail_dir
        cd etc
        make distribution DESTDIR=$jail_dir
        mount_devfs devfs $D/dev
        cd $jail_dir/boot/kernel
        ln -sf $jail_dir/dev/null kernel
        ;;
    remove)
        # Проверяем, существует ли директория?
        if !(test -d $jail_dir)
            then
            echo
            echo "Директории $jail_dir не существует."
            echo
            echo "Для удаления Jail'a нужно:"
            echo "1. Изменить в файле `basename $0` директорию создания/удаления jail_dir."
            echo
            exit 64
        fi
        /bin/chflags -R noschg $jail_dir
        rm -rf $jail_dir
        exit 64
        ;;
    *)
        echo
        echo "Для создания Jail'a нужно:"
        echo "1. Изменить в файле `basename $0` директорию назначения jail_dir."
        echo "2. Использовать { create | remove } для создания/удаления."
        echo
        exit 64
        ;;
esac

echo
############################################################
# Выполняем необходимые настройки jail'a, которые хранятся в файлах

. /root/scripts/jail/conf/trifles
. /root/scripts/jail/conf/sysctl.conf
. /root/scripts/jail/conf/rc.conf
. /root/scripts/jail/conf/periodic.conf
. /root/scripts/jail/conf/rm_create_files
. /root/scripts/jail/conf/syslog.conf
. /root/scripts/jail/conf/auth.conf
. /root/scripts/jail/conf/crontab.conf

############################################################

echo
# Выход
echo "#######################################################"
echo "# Выполните jail $jail_dir имя_хоста ip-адрес /bin/sh #"
echo "#######################################################"
echo
И сами конфиги:

auth.conf

Код: Выделить всё

echo "Создаём auth.conf"
# Создаём auth.conf
cat > $jail_dir/etc/auth.conf << "EOF"
crypt_default   =       blf
EOF
crontab.conf

Код: Выделить всё

echo "Создаём crontab"
# Создаём crontab
cat > $jail_dir/etc/crontab << "EOF"
# /etc/crontab - root's crontab for FreeBSD
#
# $FreeBSD: src/etc/crontab,v 1.32 2002/11/22 16:13:39 tom Exp $
#
SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
HOME=/var/log
#
#minute hour    mday    month   wday    who     command
#
#*/5    *       *       *       *       root    /usr/libexec/atrun
#
# Save some entropy so that /dev/random can re-seed on boot.
*/11    *       *       *       *       operator /usr/libexec/save-entropy
#
# Rotate log files every hour, if necessary.
0       *       *       *       *       root    newsyslog
#
# Perform daily/weekly/monthly maintenance.
1       3       *       *       *       root    periodic daily
15      4       *       *       6       root    periodic weekly
30      5       1       *       *       root    periodic monthly
#
# Adjust the time zone if the CMOS clock keeps local time, as opposed to
# UTC time.  See adjkerntz(8) for details.
#1,31   0-5     *       *       *       root    adjkerntz -a
EOF
periodic.conf

Код: Выделить всё

echo "Создаём periodic.conf"
# Создаём periodic.conf
cat > $jail_dir/etc/periodic.conf << "EOF"
daily_status_disks_enable="NO"
daily_status_network_enable="NO"
daily_status_security_noamd="NO"
daily_status_security_chkmounts_enable="NO"
daily_status_security_ipfdenied_enable="NO"
daily_status_security_ipfwdenied_enable="NO"
daily_status_security_ipfwlimit_enable="NO"
daily_status_security_ip6fwdenied_enable="NO"
daily_status_security_ip6fwlimit_enable="NO"
EOF
rc.conf

Код: Выделить всё

echo "Создаём rc.conf"
# Создаём rc.conf
cat > $jail_dir/etc/rc.conf << "EOF"
network_interfaces=""
syslogd_flags="-ss"
rpcbind_enable="NO"
inetd_enable="NO"
sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_msp_queue_enable="NO"
update_motd="NO"

# SSH
#sshd_enable="YES"

# Apache
#apache_enable="YES"

# mysql
#mysql_enable="YES"
EOF
rm_create_files

Код: Выделить всё

echo "Создаём/Удаляем файлы с логами"
# Создаём/Удаляем файлы с логами
touch $jail_dir/var/log/sshd.log
rm -f $jail_dir/var/log/lpd-errs $jail_dir/var/log/ppp.log $jail_dir/var/log/xferlog $jail_dir/var/log/slip.log
sysctl.conf

Код: Выделить всё

echo "Создаём sysctl"
# Создаём sysctl
cat > $jail_dir/etc/sysctl.conf << "EOF"
security.bsd.see_other_uids=0
security.bsd.see_other_gids=0
EOF
syslog.conf

Код: Выделить всё

echo "Создаём syslog.conf"
# Создаём syslog.conf
cat > $jail_dir/etc/syslog.conf << "EOF"
*.err;kern.warning;auth.notice;mail.crit                /dev/console
*.notice;authpriv.none;kern.debug;lpr.info;mail.crit;news.err   /var/log/messages
security.*                                      /var/log/security
auth.info;authpriv.info                         /var/log/auth.log
mail.info                                       /var/log/maillog
cron.*                                          /var/log/cron
*.=debug                                        /var/log/debug.log
*.emerg                                         *
!sshd
*.*                                             /var/log/sshd.log
EOF
trifles

Код: Выделить всё

echo "Создаём resolv.conf,fstab и localtime"
# Создаём resolv.conf,fstab и localtime
touch $jail_dir/etc/fstab
echo "nameserver ИП_DNS_СЕРВЕРА" > $jail_dir/etc/resolv.conf
cp /usr/share/zoneinfo/Europe/Moscow $jail_dir/etc/localtime
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 34924
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2007-04-16 13:00:02

Код: Выделить всё

#!/bin/sh

# variables
cat="/bin/cat"
awk="/usr/bin/awk"
grep="/usr/bin/grep"
echo="/bin/echo"
pw="/usr/sbin/pw"

# Выгребаем аккаунты пользователей, по идентификаторам:
${grep} -v "^#" /etc/passwd | {
while read user_string
do
user_name="`${echo} ${user_string} | awk -F ':' '{print $1}'`"
# смотрим идентификатор пользователя. Если больше 1000 то что-то делаем
if [ `${echo} ${user_string} | awk -F ':' '{print $3}'` -ge 1000 ]
then
        #echo "Больше = `${echo} ${user_string} | awk -F ':' '{print $3}'`"
        # Проверяем наличие альяса
        user_name2="`${grep} \"^${user_name}:\" \
                        /etc/aliases | awk -F ':' '{print $1}'`"
        if [ "${user_name}x" = "${user_name2}x" ]
        then
                # Альяс есть.
        else
                # Альяса нет. Лочим юзера.
                #echo $user_name
                ${pw} lock ${user_name}
        fi
else
        # системный юзер...
fi

done
}

а вот это будет запускаться на test.lissyara.su, наверно, часа в три-четыре ночи
и будет оно лочить юзеров без альясов.
Последний раз редактировалось Alex Keda 2007-04-17 9:56:41, всего редактировалось 1 раз.
Убей их всех! Бог потом рассортирует...

Аватара пользователя
schizoid
подполковник
Сообщения: 3228
Зарегистрирован: 2007-03-03 17:32:31
Откуда: Украина, Чернигов
Контактная информация:

Непрочитанное сообщение schizoid » 2007-04-16 15:03:51

Скипт, который показывает юзеров, которые сейчас подключены по ВПНу ( в случае с сервером на pptp).
Показывает общее количество. Интерфейс, виртуальный_ип, реальный_ип, ДНС_имя.
так же шлеть на мыло письмо админу, если юзверь забрался не со своей машины.
Сейчас работает через мускль, мона и в файл. Делал через мускль, что б потом мона было удобно вывести в табличку на страничку сайта.

мож конечно и коряво, мож мона и проще как-то... но работает :)
крутится в кроне.

Код: Выделить всё

#!/bin/sh
date=`date "+ %Y-%m-%d %H:%M:%S"`
#echo date=$date
run=`ls /var/run/ | grep tun | wc -l`
#echo "Total connections: "$run
sock=`sockstat | grep 100:1723 | awk '{print $3}' | sort`  ##socstat'om delaem viborku PID
tunx=`netstat -r -f inet | grep tun | awk '{print $6}'` ## netstat'om delaem viborku vseh tunX na tekuschiy moment
path=/usr/local/bin
## ifconfig'om delaem viborky po tunX i zapisivaem v file=ifcfg v odnu stroky
for j in $tunx
do
ifconfig $j | awk 'BEGIN { ORS = " "} {print}' >> /tmp/ifcfg
echo >> /tmp/ifcfg
done

#clear database
echo "use vpn; delete from conn; delete from info;" > /tmp/vpn_del.sql
$path/mysql < /tmp/vpn_del.sql
rm /tmp/vpn_del.sql


echo "use vpn; insert into info values ('$run','$date');" >> /tmp/info.sql
$path/mysql < /tmp/info.sql



echo "use vpn;" > /tmp/vpn.sql
if [ $run -eq 0 ]
 then echo $date --> NO CONNECTION
  else
   for i in $sock
    do
        k=`expr $i + 1`
   #echo ---------------------------       
   if=`cat /tmp/ifcfg | grep $k | awk '{print $1}'` ; # echo if=${if%:};
        vip=`cat /tmp/ifcfg | grep $k | awk '{print $8}'`; # echo "virtual IP = $vip"
        rip=`sockstat | grep 100:1723 | grep $i | awk '{print $7}'| awk -F : '{print $1}'` ; # echo "rial IP = $rip"
   host=`host $rip | awk '{print $5}' | awk -F . '{print $1}'` ; # echo host=$host
   rip_=`cat /etc/ppp/ppp.secret |grep -w $vip |awk '{print $4}'`; # echo $rip_
   if [ $rip = $rip_ ]
    then i=1;
     else i=0 && echo "${if%:} ~ $vip ~ $rip ~ $host ~ $date" | mail -s "Bad connections!!!" admin@domen.ua
   fi
   echo "insert into conn values ('${if%:}','$vip','$rip','$host','$date','$i');" >> /tmp/vpn.sql
      
    done
   $path/mysql < /tmp/vpn.sql
fi
rm /tmp/ifcfg 2>/dev/null
rm /tmp/vpn.sql 2>/dev/null
rm /tmp/info.sql 2>/dev/null

ядерный взрыв...смертельно красиво...жаль, что не вечно...

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 34924
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2007-04-16 20:57:08

Код: Выделить всё

#!/bin/sh -xv


# programms path
sysctl="/sbin/sysctl"
shutdown="/sbin/shutdown"
awk="/usr/bin/awk"
who="/usr/bin/who"
grep="/usr/bin/grep"
su="/usr/bin/su"
sleep="/bin/sleep"
wall="/usr/bin/wall"
echo="/bin/echo"

# env`s
LANG="ru_RU.KOI8-R"
export LANG
MM_CHARSET="KOI8-R"
export MM_CHARSET

# power source
if [ `${sysctl} hw.acpi.battery.state | ${awk} '{print $2}'` -eq 2 ]
then
        # cable
        exit 0;
else
        # battery
        if [ `${sysctl} hw.acpi.battery.life | ${awk} '{print $2}'` -lt 5 ]
        then
                # echo message
                ${who} | ${grep} -v tty |
                while read user_string
                do
                DISPLAY="`${echo} ${user_string} | awk '{print $2}'`"
                export DISPLAY
                ${su} `${echo} ${user_string} | awk '{print $1}'` \
                        -c "/usr/X11R6/bin/Xdialog --title \
                        \"Компьютер отключается!\" \
                        --icon /usr/X11R6/share/doc/xdialog/samples/warning.xpm \
                        --msgbox \"Компьютер отключится через минуту!\nСадится батарея!\" 0 0"&
                done
                ${echo} "Компьютер отключится через минуту!" | ${wall}
                # shutdown mashine
                ${sleep} 60 && ${shutdown} -p now &
                exit 0;
        fi
fi
exit 0;


написал для своего ноута - чтоб отключался при заряде батарейки 5% и меньше. работает в кроне - раз в 2 минуты
отсылает сообщение во все иксы, окошком с ОК и во все консоли.
для иксов требует порт Xdialog
Последний раз редактировалось Alex Keda 2007-04-26 23:15:11, всего редактировалось 1 раз.
Убей их всех! Бог потом рассортирует...

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 34924
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2007-04-22 20:44:25

Код: Выделить всё

/usr/local/etc/periodic/daily/>more 470.exim-mail-statistic.sh
#!/bin/sh


# достаём день, год, и старый месяц
old_day=`date -v-1d '+%d'`
year=`date '+%Y'`
old_month=`date -v-1m '+%m'`
# Если первое число месяца, и предыдущий месяц
# был 12 - то вычисляем старый год
# если первое число выполняем содержимое:
if [ ${old_month} = 12 ]
then
        old_year=`date -v-1y '+%Y'`
else
        old_year=${year}
fi
# старый месяц - если была смена месяца
if [ `date +%d` = 01 ]
then
        old_month="`date -v-1m '+%m'`"
else
        old_month="`date '+%m'`"
fi

echo "**************** EXIM statistic started **********************"
/usr/local/sbin/eximstats -ne /var/log/exim/main-${old_year}${old_month}${old_day}.log
rm /var/log/exim/main-${old_year}${old_month}${old_day}.log
rm /var/log/exim/reject-${old_year}${old_month}${old_day}.log
echo "**************** EXIM statistic ended ************************"


скрипт подбивания статистики exim.
у меня логи идут в два места - ещё и в syslog - соотвтествннео эти удаляются за ненаобностью...
Убей их всех! Бог потом рассортирует...

Аватара пользователя
serge
майор
Сообщения: 2131
Зарегистрирован: 2006-07-30 15:34:14
Откуда: Саратов
Контактная информация:

Непрочитанное сообщение serge » 2007-04-22 21:14:02

Добавление учетной записи компа в самба домен. Должна быть группа computers

Код: Выделить всё

#!/bin/sh
read -p 'Computer Name:' name
pw useradd -n ${name}$ -c "Computer" -s /usr/sbin/nologin -g computers -d "/nonexistent"
Последний раз редактировалось serge 2007-04-22 21:49:01, всего редактировалось 1 раз.

Аватара пользователя
Sova
старшина
Сообщения: 444
Зарегистрирован: 2006-09-13 14:10:59
Откуда: Цхинвал-Москва
Контактная информация:

Непрочитанное сообщение Sova » 2007-04-23 11:15:01

lissyara писал(а):в понедельник. на работе лежит.
==========
p.s. чуть позже (когда темы кончаться :)) поудаляю все обсуждения в этой ветке.


А где обещанный скрипт? Уж пол понедельника прошло

Аватара пользователя
o2x
мл. сержант
Сообщения: 112
Зарегистрирован: 2007-01-31 17:46:54

Непрочитанное сообщение o2x » 2007-04-25 11:59:40

Скрипт дампа системы:

Код: Выделить всё

#!/bin/sh
# Enter info:
e_mail="onyx@xxx.xxx.ua"
backup_date="`date +%d-%m-%Y`"

# Path to command
mount="/sbin/mount"
umount="/sbin/umount"
dump="/sbin/dump"
# Path to programm
massive="/mnt/usb_mass"


# Mount usb massive
${mount} /dev/da0s1 ${massive}

# Create dump slice
${dump} -0ua -L -f ${massive}/dump_root.img /dev/ad0s1a
${dump} -0ua -L -f ${massive}/dump_usr.img /dev/ad0s1d
${dump} -0ua -L -f ${massive}/dump_var.img /dev/ad0s1e

# If file exists
if [ -f $massive/dump_root.img ]
then dump1="Image dump_root.img was created";
else echo "Image dump_root.img was not created, please see this dump!" | mail -s "!!ERROR Dump!!" ${e_mail}
exit 2;
fi

if [ -f $massive/dump_usr.img ]
then dump2="Image dump_usr.img was created";
else echo "Image dump_usr.img was not created, please see this dump!" | mail -s "!!ERROR Dump!!" ${e_mail}
exit 2;
fi

if [ -f $massive/dump_var.img ]
then dump3="Image dump_var.img was created";
else echo "Image dump_var.img was not created, please see this dump!" | mail -s "!!ERROR Dump!!" ${e_mail}
exit 2;
fi

# Umount usb massive
${umount} ${massive}

# Mail to me
echo "
${dump1}
${dump2}
${dump3}
" | mail -s dump_${backup_date} ${e_mail}

valmont
проходил мимо

Скриптик для ограничения траффика юзеров (LINUX)

Непрочитанное сообщение valmont » 2007-04-25 16:20:27

Самый простой скриптик для ограничения объема скачанного траффика.
Модификация и предложения за вами. Единственно, по-моему нет смысла ставить ограничение на маки, поскольку маки для этого нужно знать, во-вторых, при подключении нового компа его нужно прописывать и в конце концов, юзеры не должны сами менять себе айпи. Предложения и улучшения в студию!

Код: Выделить всё

#!/bin/bash
#
#  Что Делает: на роутере при превышении траффика вырубает доступ!


#  Суть в чем: в таблицу mangle цепочки FORWARD добавляются правило ACCEPT для каждого IP  сети
# это делается командой `./tlimiter.sh on` и делается это для того,чтобы траффик каждого IP считался
# с этого момента. Раз в 5 минут я (cronom) запускаю скрипт `./tlimiter.sh limit`. Эта часть скрипта
# проверяет, не превысил ли кто-нить лимит в 200Мб(счетчик работает от 10Мб до 999Мб ТОЧНО верх.предел не проверял)
# Если кто-нибудь превысил лимит, его переадресует на апач(сами можете сделать что угодно, можете даже нах послать,
#такие сайты есть)
##############
##############
# Установка:
#  cp ./tlimiter.sh /root/bin/tlimiter.sh
# chmod +x /root/bin/tlimiter.sh
# for crontab:
#  crontab crontab
#  где cronfab -  файл со строками (Добавляете эти строки)
#########################################
#*/5 * * * * /root/bin/tlimiter.sh limit  1>/dev/null 2>&1
#1 1 * * * /root/bin/tlimiter.sh set0 1>/dev/null 2>&1
#########################################
# все
##############
##############
# Автор Алексей Тарасов
#
#iptables v 1.3.3
#bash v 3.00
#grep v 2.5.1
#awk v 3.1.4
ipt="/usr/sbin/iptables"
#путь до айпитейблс

unlim="192.168.5.25 \
       192.168.5.131 \
   192.168.5.189 \
   192.168.5.81 \
   192.168.5.229"
#айпи, на которые лимит не распространяется

apach=9999;
#  куда я переадресую превысивших лимит (у меня апач на роутере на 9999 порту, а там страница: В превісили лимит!)
case "$1" in
    on)
    i=1
    while [ $i -le 254 ]
   do
        $ipt -t mangle -A FORWARD -d 192.168.5.$i -j ACCEPT
   i=`expr $i + 1`
        done
   # создаю свою цепочку каждому айпи в сети
   for i1 in $unlim;
   do
   $ipt -t mangle -D FORWARD -d $i1 -j ACCEPT
   done
   # убираю цепочки для не облагающихся лимитом
   # эти 2 цепочки д.б. одинаковы с разницей  -D в последней -A в первой
   ;;
   
   
    set0)
    $ipt -t mangle -Z
    i=1
    while [ $i -le 254 ]
    do
    $ipt -t nat -D PREROUTING  -s 192.168.5.$i -p tcp --dport 80 -j REDIRECT --to $apach
    i=`expr $i + 1`
    done
    # ночью все таблицы мангл обнуляются и все лимиты сбрасываются
    #  то же, что в последней секции
   ;;
   
   
    off)
    i=1
    while [ $i -le 254 ]
   do
   $ipt -t mangle -D FORWARD -d 192.168.5.$i -j ACCEPT
        i=`expr $i + 1`
   done
   # удаляет все контрольные записи
   # д,б, той же что и в секции ON
   ;;
   
   
    status)
    echo "#########################################################################"
    echo "##########   Таблица Манглы здесь счетчики   ########################"
    echo "#########################################################################"

    $ipt -L -v -n -t mangle |grep 192.168.5|less
    #печатает контрольную таблицу
    echo "#########################################################################"
    echo "##########   Таблица Нат здесь переадресация заблоченных   ########"
    echo "#########################################################################"
    $ipt -t nat -L -v -n |grep $apach |less
    #печатает проштрафифшихся на данный момент
   ;;
   
   
    limit)
    #######################################################################  HERE LIMIT IN MB ##########
blocked=`$ipt -L -n -v -t mangle |grep 192.168.5 |awk '{if($2~/M$/){gsub(/M/,x);if($2>200){print $9}}}'`
# здесь вычисляется массив превысивших лимит цифрка 200 здеееееееееееееееееееееееееесь^ это и обозначает
for each in $blocked;
do
$ipt -t nat -D PREROUTING  -s $each -p tcp --dport 80 -j REDIRECT --to $apach
# эта строка здесь нужна для того,чтобы не множить это правило, удаляет примененное(если не было выдает ошибку,но робает дальше)
# потом применяет правило строки д.б. одинаковы с точностью до -D -A
$ipt -t nat -A PREROUTING  -s $each -p tcp --dport 80 -j REDIRECT --to $apach

#і$ipt -A INPUT -s $each -j DROP
#і$ipt -A FORWARD -s $each -j DROP
# как варианты
done
#проверяет, не превзошел ли кто лимит и если превзошел, то для него применяется правило, его айпи в массиве "blocked"
   ;;
   
   
    *)
    echo "Usage `basename $0` (on|off|set0|status|limit)"
   
    exit 1
        ;;

esac

Аватара пользователя
o2x
мл. сержант
Сообщения: 112
Зарегистрирован: 2007-01-31 17:46:54

Непрочитанное сообщение o2x » 2007-04-25 16:32:22

Простенький скрипт для ограничения на ipfw доступа пользователей к фтп.
С 21:00 до 4 утра доступ по фтп разрешен, остальное время запрещен.

Код: Выделить всё

#! /bin/sh
fwcmd="/sbin/ipfw -q"
LanOut="em1"
LanIn="em0"
IPOut="xxx.xxx.xxx.xxx"
NetInIP="192.168.0.0/16"

date_hour="`date +%H`";

# Если текущее время (or)  4:00 > t > 21:00
if [ $date_hour -ge 21 -o $date_hour -le 4 ]
then
        echo "Разрешенное время работы по фтп!";
        pravilo="`$fwcmd show | grep "00202" | wc -l`"
        # Если правило уже существует
        if [ $pravilo -eq 1 ]
        then
                echo "Правило существует. Доступ разрешен!";
                echo "Выход...";
                exit 0;
        else
                echo "Разрешаем доступ на порты!";
                ${fwcmd} 201 delete 2> /dev/null;
                ${fwcmd} 202 add allow tcp from ${NetInIP} to any 20,21 via ${LanIn}
                exit 0;
        fi

else
        echo "Запрещенное время работы по фтп!";
        pravilo="`$fwcmd show | grep "00201" | wc -l`"

        # Если правило уже существует
        if [ $pravilo -eq 1 ]
        then
                echo "Правило существует. Доступ запрещен!";
                echo "Выход...";
                exit 0;
        else
                echo "Запрещаем доступ на порты!";
                ${fwcmd} 202 delete 2> /dev/null;
                ${fwcmd} 201 add deny tcp from ${NetInIP} to any 20,21 via ${LanIn}
                exit 0;
        fi

fi
exit 0;

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Непрочитанное сообщение dikens3 » 2007-04-25 16:51:13

Можно проще делать

1. По умолчанию в фаере доступ к FTP запрещён
2. Закидываешь в cron 2-е строки:

1-Я Добавление правил в такое-то время и т.п.
2-Я Удаление правил.
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

valmont
проходил мимо

доступ к фтп

Непрочитанное сообщение valmont » 2007-04-25 18:21:35

У iptables вообще есть указание со скольки до скольки правилу работать, но суть просто в возможностях шелла, этим и красив unix.
#cat < /dev/tcp/weather.tomsk.net/7777

selinia
ефрейтор
Сообщения: 53
Зарегистрирован: 2007-02-20 0:06:30

Непрочитанное сообщение selinia » 2007-04-28 0:54:22

lissyara писал(а):скрипт подсчёт траффика - используется на test.lissyara.su. Кроном - раз в 10 минут...

а можно как-то считать трафик отдельного системного юзера ?

Аватара пользователя
proxy-man
лейтенант
Сообщения: 692
Зарегистрирован: 2006-04-05 12:06:13
Откуда: Odessa
Контактная информация:

Непрочитанное сообщение proxy-man » 2007-04-28 20:08:42

Привет камрады... :)
Кто немножко разжует чайнику, что значит вот этот кусок скрипта:

Код: Выделить всё

if [ -z "${source_rc_confs_defined}" ]; then
   if [ -r /etc/defaults/rc.conf ]; then
      . /etc/defaults/rc.conf
      source_rc_confs
   elif [ -r /etc/rc.conf ]; then
      . /etc/rc.conf
   fi
fi

Я, согласно своего скудоумия, упираюсь в следующие грабли:
1 - ключик -z в первом операторе выбора
2 - ключик -r в идущих уже ниже ветвлениях
3 - оператор точка - в Perl это операция конкатеннации, а что это значит в C-shell?
Have trouble with Windows - reboot,
Have trouble with Unix - be root!

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 34924
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2007-04-28 20:19:03

Убей их всех! Бог потом рассортирует...

Аватара пользователя
proxy-man
лейтенант
Сообщения: 692
Зарегистрирован: 2006-04-05 12:06:13
Откуда: Odessa
Контактная информация:

Непрочитанное сообщение proxy-man » 2007-04-28 20:30:23

lissyara писал(а):http://www.lissyara.su/?id=1075

ключики z и r - понятны... я где-то так полагал... как быть точкой? про точке в доке данных нет...
ЗЫ - Лис я как-то уже спрашивал, что за первоисточник лежит в основе доки по shell-у что у тебя на сайте? Есть ли бумажный аналог?
Тема про точку снята... кажися нашел :)
Кроме того, точка является встроенной командой shell:

. файл [аргументы]

Она читает и выполняет команды из указанного файла в среде текущего командного интерпретатора. Искомый файл не обязательно должен быть выполняемым. Если указаны аргументы, то они становятся позиционными параметрами при обработке файла.

Эту команду имеет смысл использовать, когда у вас есть несколько командных файлов, использующих одинаковые функции или схожие фрагменты кода. Тогда общую для всех сценариев часть помещают в отдельный файл и включают ее в сценарий в нужном месте с помощью команды точка. Это позволяет сократить общий размер программного кода, а самое главное — упрощает внесение в него изменений.

Еще раз напомню про первоисточник :)
Have trouble with Windows - reboot,

Have trouble with Unix - be root!

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 34924
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2007-04-28 21:00:02

где-то в инете подобрал...
Убей их всех! Бог потом рассортирует...

Аватара пользователя
proxy-man
лейтенант
Сообщения: 692
Зарегистрирован: 2006-04-05 12:06:13
Откуда: Odessa
Контактная информация:

Непрочитанное сообщение proxy-man » 2007-04-28 23:06:14

Кропал тут фаер... и решил накропать скажем так, более удобный и менее утомительный в наборе вариант системного фаера (умолчательного /etc/rc.firewall) :)
Часть функций накатал на запас...

Код: Выделить всё

#!/bin/sh
###########FIREWALL RULESET############
##########-----VARIABLES----###########
FwCMD="/sbin/ipfw -q "
########################################
# testing variables
IpOut="10.0.18.175"
IpIn="192.168.10.100"
IfIn="xl0"
IfOut="xl1"
OutNetMask="21"
InNetMask="24"
##################################################
##############common_vars_of_LAN/WAN##############
############icmp_types,tcp/udp proto##############
TcpProto="22 20 21 25 110 80 8080 1723 53 123"
UdpProto="53"
NetTrust="192.168.10.0/24 10.0.0.0/21"
NetIn="192.168.10.0/24"
IfTrust="xl0 xl1"
####################INCLUDED_FUNCTIONS##################   
#######################################################
# Suck in the configuration variables.
if [ -z "${source_rc_confs_defined}" ]; then
   if [ -r /etc/defaults/rc.conf ]; then
      . /etc/defaults/rc.conf
      source_rc_confs
   elif [ -r /etc/rc.conf ]; then
      . /etc/rc.conf
   fi
fi
######################################################################
# Network Address Translation.  This rule is placed here deliberately
# so that it does not interfere with the surrounding address-checking
# rules.  If for example one of your internal LAN machines had its IP
# address set to 192.0.2.1 then an incoming packet for it after being
# translated by natd(8) would match the `deny' rule above.  Similarly
# an outgoing packet originated from it before being translated would
# match the `deny' rule below.
divert_nat(){
case ${natd_enable} in
   [Yy][Ee][Ss])
   if [ -n "${natd_interface}" ]; then
      ${FwCMD} add divert natd all from ${NetIn} to any out via ${natd_interface}
      ${FwCMD} add divert natd all from any to 10.0.18.175 in via ${natd_interface}
   fi
      ;;
esac
}
# function for Iface loopback
setup_loopback(){
   ${FwCMD} add allow ip from any to any via lo0
   ${FwCMD} add deny ip from any to 127.0.0.0/8
   ${FwCMD} add deny ip from 127.0.0.0/8 to any
}
# allow connections after restricted rules
pass_connections(){
   ${FwCMD} add pass tcp from any to any established
   ${FwCMD} add pass all from any to any frag
   ${FwCMD} add pass tcp from me to any setup
   ${FwCMD} add pass udp from me to any keep-state
}
# function for ICMP types
setup_icmp(){
case ${firewall_allowed_icmp} in
   [Yy][Ee][Ss])
   for type in ${firewall_allowed_icmp_types}; do
      ${FwCMD} add allow icmp from any to any icmptypes ${type}
   done
   ;;
esac
}
# functions for Trusted NETs
setup_trust_net(){
   for trust_net in ${NetTrust}; do
      ${FwCMD} add allow ip from me to ${trust_net} via ${IfOut}
      ${FwCMD} add allow ip from ${trust_net} to me via ${IfOut}
   done
}
# functions for Trusted Interfaces
setup_trust_iface(){
   for trust_iface in ${IfTrust}; do
      ${FwCMD} add allow all from any to any via ${trust_iface}
   done
}
# open tcp-ports
setup_open_tcp(){
   for tcp_port in ${TcpProto}; do
      ${FwCMD} add allow ip from any to me ${tcp_port} setup
   done
}
# open udp_ports
setup_open_udp(){
   for udp_port in ${UdpProto}; do
      ${FwCMD} add allow udp from any to me ${udp_port}
      ${FwCMD} add allow udp from me ${udp_port} to any
   done
}
# not routed nets
deny_nets(){
   nets="192.168.0.0/16 172.16.0.0/12 \
      0.0.0.0/8 169.254.0.0/16 192.0.2.0/24 \
      224.0.0.0/4 240.0.0.0/4"
   for net in ${nets}; do
      ${FwCMD} add deny ${log} all from ${net} to any via ${IfOut}
   done
}
deny_nets_rev(){
   nets="192.168.0.0/16 172.16.0.0/12 \
      0.0.0.0/8 169.254.0.0/16 192.0.2.0/24 \
      224.0.0.0/4 240.0.0.0/4"
   for net in ${nets}; do
      ${FwCMD} add deny ${log} all from any to ${net} via ${IfOut}
   done
}
# deny restriction
deny_restrict(){
   ${FwCMD} add 65000 deny ${log} all from any to any
}
####################################################
# flushed all the rules
${FwCMD} -f flush

# loopback
setup_loopback

# Trust Nets
setup_trust_net

# Stop RFC1918 nets on the outside interface
# Stop draft-manning-dsua-03.txt (1 May 2000) nets (includes RESERVED-1,
# DHCP auto-configuration, NET-TEST, MULTICAST (class D), and class E)
# on the outside interface
deny_nets_rev

# NAT
divert_nat

# Stop RFC1918 nets on the outside interface
# Stop draft-manning-dsua-03.txt (1 May 2000) nets (includes RESERVED-1,
# DHCP auto-configuration, NET-TEST, MULTICAST (class D), and class E)
# on the outside interface
deny_nets

# Allow TCP through if setup succeeded
pass_connections

# Pass allowed ICMP
setup_icmp

# Pass allowed TCP proto
setup_open_tcp

# Pass allowed UDP proto
setup_open_udp

# Trust Iface
setup_trust_iface

# ruleset #65000 - deny all from any to any
deny_restrict

Have trouble with Windows - reboot,

Have trouble with Unix - be root!

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 34924
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2007-04-28 23:09:27

нифигасебе

Код: Выделить всё

OutNetMask="21"
Убей их всех! Бог потом рассортирует...

Аватара пользователя
proxy-man
лейтенант
Сообщения: 692
Зарегистрирован: 2006-04-05 12:06:13
Откуда: Odessa
Контактная информация:

Непрочитанное сообщение proxy-man » 2007-04-28 23:11:29

lissyara писал(а):нифигасебе

Код: Выделить всё

OutNetMask="21"

Куле... это же домовая сеть... половину жилого массива покрывает, а на районе вообще живет около 300 тыс. народу (Пос.Котовского в Одессе), так шо маски такие вот... :)
Have trouble with Windows - reboot,

Have trouble with Unix - be root!

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 34924
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2007-04-29 11:03:46

а.
а я думал вообще вся твоя :)
Убей их всех! Бог потом рассортирует...


Вернуться в «SHELL»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя