Страница 1 из 11
Полезные скрипты наструганные на коленке.
Добавлено: 2007-04-16 11:08:07
Alex Keda
Сабж. Думаю, у всех есть пачки таких скриптов...
Озадачился после случайного стирания пары нужных

))
F.A.Q.
1. Сам скрипт в тегах
Код: Выделить всё
2. Описание что делает, и указание - возможен ли запуск из крона (частенько, работающий от юзера скрипт из крона не запускается).
3. для вопросов - создавайте другие темы!
===============
[color=red]Пароли и прочее заменяйте на абстрактные данные, типа exim_db/exim_user/exim_pass[/color]
Добавлено: 2007-04-16 11:27:39
dikens3
Речь только об Exim'овских скриптах я так полагаю?
Добавлено: 2007-04-16 11:33:04
Alex Keda
ну почему же - shell, наверно, преимущественно...
раздел то про юникса...
а вообще - думаю пригодится всё.
Добавлено: 2007-04-16 12:06:43
Alex Keda
Код: Выделить всё
#!/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 минут...
Добавлено: 2007-04-16 12:09:31
dikens3
Может пригодится кому, практически полная установка 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
Добавлено: 2007-04-16 13:00:02
Alex Keda
Код: Выделить всё
#!/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, наверно, часа в три-четыре ночи
и будет оно лочить юзеров без альясов.
Добавлено: 2007-04-16 15:03:51
schizoid
Скипт, который показывает юзеров, которые сейчас подключены по ВПНу ( в случае с сервером на 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
Добавлено: 2007-04-16 20:57:08
Alex Keda
Код: Выделить всё
#!/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
Добавлено: 2007-04-22 20:44:25
Alex Keda
Код: Выделить всё
/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 - соотвтествннео эти удаляются за ненаобностью...
Добавлено: 2007-04-22 21:14:02
serge
Добавление учетной записи компа в самба домен. Должна быть группа computers
Код: Выделить всё
#!/bin/sh
read -p 'Computer Name:' name
pw useradd -n ${name}$ -c "Computer" -s /usr/sbin/nologin -g computers -d "/nonexistent"
Добавлено: 2007-04-23 11:15:01
Sova
lissyara писал(а):в понедельник. на работе лежит.
==========
p.s. чуть позже (когда темы кончаться

) поудаляю все обсуждения в этой ветке.
А где обещанный скрипт? Уж пол понедельника прошло
Добавлено: 2007-04-25 11:59:40
o2x
Скрипт дампа системы:
Код: Выделить всё
#!/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}
Скриптик для ограничения траффика юзеров (LINUX)
Добавлено: 2007-04-25 16:20:27
valmont
Самый простой скриптик для ограничения объема скачанного траффика.
Модификация и предложения за вами. Единственно, по-моему нет смысла ставить ограничение на маки, поскольку маки для этого нужно знать, во-вторых, при подключении нового компа его нужно прописывать и в конце концов, юзеры не должны сами менять себе айпи. Предложения и улучшения в студию!
Код: Выделить всё
#!/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
Добавлено: 2007-04-25 16:32:22
o2x
Простенький скрипт для ограничения на 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;
Добавлено: 2007-04-25 16:51:13
dikens3
Можно проще делать
1. По умолчанию в фаере доступ к FTP запрещён
2. Закидываешь в cron 2-е строки:
1-Я Добавление правил в такое-то время и т.п.
2-Я Удаление правил.
доступ к фтп
Добавлено: 2007-04-25 18:21:35
valmont
У iptables вообще есть указание со скольки до скольки правилу работать, но суть просто в возможностях шелла, этим и красив unix.
#cat < /dev/tcp/weather.tomsk.net/7777
Добавлено: 2007-04-28 0:54:22
selinia
lissyara писал(а):
скрипт подсчёт траффика - используется на test.lissyara.su. Кроном - раз в 10 минут...
а можно как-то считать трафик отдельного системного юзера ?
Добавлено: 2007-04-28 20:08:42
proxy-man
Привет камрады...

Кто немножко разжует чайнику, что значит вот этот кусок скрипта:
Код: Выделить всё
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?
Добавлено: 2007-04-28 20:19:03
Alex Keda
Добавлено: 2007-04-28 20:30:23
proxy-man
ключики z и r - понятны... я где-то так полагал... как быть точкой? про точке в доке данных нет...
ЗЫ - Лис я как-то уже спрашивал, что за первоисточник лежит в основе доки по shell-у что у тебя на сайте? Есть ли бумажный аналог?
Тема про точку снята... кажися нашел
Кроме того, точка является встроенной командой shell:
. файл [аргументы]
Она читает и выполняет команды из указанного файла в среде текущего командного интерпретатора. Искомый файл не обязательно должен быть выполняемым. Если указаны аргументы, то они становятся позиционными параметрами при обработке файла.
Эту команду имеет смысл использовать, когда у вас есть несколько командных файлов, использующих одинаковые функции или схожие фрагменты кода. Тогда общую для всех сценариев часть помещают в отдельный файл и включают ее в сценарий в нужном месте с помощью команды точка. Это позволяет сократить общий размер программного кода, а самое главное — упрощает внесение в него изменений.
Еще раз напомню про первоисточник

Добавлено: 2007-04-28 21:00:02
Alex Keda
где-то в инете подобрал...
Добавлено: 2007-04-28 23:06:14
proxy-man
Кропал тут фаер... и решил накропать скажем так, более удобный и менее утомительный в наборе вариант системного фаера (умолчательного /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
Добавлено: 2007-04-28 23:09:27
Alex Keda
Добавлено: 2007-04-28 23:11:29
proxy-man
lissyara писал(а):нифигасебе
Куле... это же домовая сеть... половину жилого массива покрывает, а на районе вообще живет около 300 тыс. народу (Пос.Котовского в Одессе), так шо маски такие вот...

Добавлено: 2007-04-29 11:03:46
Alex Keda
а.
а я думал вообще вся твоя
