Тег-архив » Linux «

Shell Скрипты: бан левых ssh пассажиров

Скрипт баннит хосты, которые пытаются подключиться к серверу с несуществующих пользователей.

#!/usr/local/bin/zsh
#####################################################
# This script closes illegal attempts of login into #
# system and adds the essential rule to firewall    #
#####################################################
# vars #

CAT="/bin/cat"
GREP="/usr/bin/grep"
AWK="/usr/bin/awk"
UNIQ="/usr/bin/uniq"
LOG="/var/log/auth.log"
FIREWALL="/etc/rc.firewall"
FDENY="/etc/deny_hosts"
##############################################
# parsing the log file and creatina an array #

ARR=(`${CAT} ${LOG}|${GREP} 'Invalid user'|${AWK} '{print $10}'|${UNIQ}`)
################################################################
# create function for add data from an array to a special file #
f_deny(){
        for names in ${ARR}; do
                echo $names >> ${FDENY}
        done
}
############################################################
# check if a file for deny hosts exists and start function #

if [ -e ${FDENY} ]; then
        f_deny
else
        touch ${FDENY}
        f_deny
fi
####################
# restart firewall #

${IPFW} flush && /bin/sh < /etc/rc.firewall &
Twitter Google Bookmarks Закладки Yandex БобрДобр.ru Memori.ru МоёМесто.ru

Shell Скрипты: три действия: диск, домен, правка конфигов

Данный скрипт заточен под работу из УСБ и ОС FreeBSD, он выполняет три действия:
1. разбивает диск
2. вгонят в домен
3. правит конфиги ;)

Охх длинный то …

#!/bin/sh

cd /tmp && rm -Rf * >/dev/null 2>&1

case $1 in
        stop)
        exit;
        ;;
        *)
        clear;
        echo > /tmp/rc.conf.jail
        /usr/sbin/ntpdate my-domain-name.local >/dev/null 2>&1 &
        ;;
esac

# rm tmp files
tmp_dir="/tmp/install"
/bin/rm -Rf ${tmp_dir}
/bin/mkdir -p ${tmp_dir}

# variables
root_size="256"         # Mb    384
swap_size="128" # Mb    1024
usr_size="2048"         # Mb    4096
var_size="1024"         # Mb    4096

# distrib directory
dist_dir="/dist/dist"

# debug - on = 1; off = 2
debug="2"
# install new server

# prompt user - restore or not?
echo "

!!!!!  Внимание  !!!!!
Если вы не понимаете что делаете, выньше флэшку и перезагрузите сервер.
Если вы введёте YES, начнётся инсталляция нового сервера, и все данные
содержащиеся на жёстком диске будут утеряны. Если вы введёте NO, установка
будет прервана, и произойдёт автоматическая перезагрузка.

Если вы не создали в BIOS контроллера массив (для сервера), введите NO
и создайте его, после этого, заново начните установку."
echo -n "Хотите ли вы начать установку: "
read answer
# verify answer
case ${answer} in
        [Yy][Ee][Ss])
        # согласен. продолжаем
        echo""
        echo "Инсталляция нового сервера запущена!"
        ;;
        *)
        # передумал :)
        echo "Вы ответили '${answer}'. Сервер перезагружается..."
        shutdown -r now
        exit;
        ;;
esac

# select - what installing
echo -n "

Для инсталляции почтового/файлового сервера введите 'S',
для инсталляции сервера архивации введите 'B'.
Введите ваш выбор:"
read server_type
case ${server_type} in
        [Ss])
        # сервак
        echo""
        echo "Инсталляция нового файлового/почтового сервера запущена!"
        echo "1" > ${tmp_dir}/server_type.txt
        ;;
        [Bb])
        # бэкап
        echo "Инсталляция нового сервера архивации запущена!"
        echo "2" > ${tmp_dir}/server_type.txt
        ;;
esac
server_type="`/bin/cat ${tmp_dir}/server_type.txt`"

input_function() {
# input name new server
echo "
Для успешной инсталляции, ответтьте пожалуйста на несколько вопросов

Введите имя сервера (имя вводится без доменного суффикса)."
echo -n "Имя: "
read server_name_user
server_name="`echo ${server_name_user} | /usr/bin/tr '[:upper:]' '[:lower:]'`"
# проверяем введённое
if [ ${server_name}x = 'x' ]
then
        # пустое имя.
        server_name="default"
fi
# input IP new server
echo -n "Введите IP адрес этого сервера: "
read server_IP
# проверяем введённое
if [ ${server_IP}x = 'x' ]
then
        # пустой адрес.
        server_IP="172.31.0.10"
fi
# input IP default gateway
echo -n "Введите адрес шлюза: "
read gateway_IP
if [ ${gateway_IP}x = 'x' ]
then
        # пустой гейт
        gateway_IP="172.31.0.1"
fi
# input IP default gateway
if [ ${server_type} -eq 1 ]; then
echo -n "Введите адрес сервера backup: "
read backup_IP
if [ ${backup_IP}x = 'x' ]
then
        # пустой гейт
        backup_IP="172.31.0.1"
fi
fi

# input admin user login
echo -n "Введите логин администратора филиала: "
read user_login
if [ ${user_login}x = 'x' ]
then
        # пустой логин
        user_login="lissyara"
fi
# input admin user login
echo -n "Введите ВАШ логин в домене: "
read user_join_login
if [ ${user_join_login}x = 'x' ]
then
        # пустой логин
        user_join_login="akeda"
fi
# input admin user login
echo -n "Введите OU филиала: "
read filial_OU
if [ ${filial_OU}x = 'x' ]
then
        # пустой логин
        user_login="chelyabinsk"
fi

echo "
Вы ввели следующие сведения:
Имя сервера:                    ${server_name}
IP сервера:                     ${server_IP}
IP шлюза:                       ${gateway_IP}"
if [ ${server_type} = 1 ]; then
echo "IP сервера backup:                ${backup_IP}"
fi
echo "Логин администратора филиала:     ${user_login}
Ваш доменный логин:             ${user_join_login}
OU филиала:                     ${filial_OU}
"
# input user answer - correct or not data?
echo "Если эти данные верны, введите YES, в противном случае, введите NO"
echo -n "Ваш ответ: "
read result_code
# verify answer
echo -n > ${tmp_dir}/rezult.code.user.input
case ${result_code} in
        [Yy][Ee][Ss])
        # согласен. продолжаем
        echo""
        echo "Вы ввели верные данные. Инсталляция продолжается.!"
        echo "1" > ${tmp_dir}/rezult.code.user.input
        ;;
        *)
        # передумал :)
        echo "Вы ответили '${result_code}'. Повторный ввод данных"
        echo "no" > ${tmp_dir}/rezult.code.user.input
        ;;
        esac

}       # end input function

while test 1 -eq 1
do
        # вводим данные.
        /usr/bin/touch ${tmp_dir}/rezult.code.user.input
        read rezult_code < ${tmp_dir}/rezult.code.user.input
        if [ ${rezult_code}x = 1x ]
        then
                # данные введены верные. считываем переменные.
                #echo "имя серванта ${server_name}"
                break
        else
                # либо данные не введены, либо они неверные
                input_function
        fi
done

# debug - skip restore
#if [ 2 -eq 1 ]; then

# detecting hdd on server
kernel_disks="`/sbin/sysctl kern.disks | awk -F ':' '{print $2}'`"
#kern.disks: da1 da0
if [ ${debug} -eq 1 ] ; then
echo "DEBUG: 1. kernel disks = ${kernel_disks}" ; fi
# cycle for all disks - count and match
i=0
for all_disks in ${kernel_disks}
do
        # detecting disk type
        disk_type="`echo ${all_disks} | /usr/bin/tr -d '[0-9]'`"
        # detecting disk number
        disk_number="`echo ${all_disks} | /usr/bin/tr -d '[a-z]'`"
        # find ATA|SATA disks
        if [ ${disk_type} = "ad" ]
        then
                # ATA/SATA disks
                echo " detected ATA/SATA disks! "
                echo "${all_disks}" > ${tmp_dir}/ata_disk.tmp
        else
                /usr/bin/touch ${tmp_dir}/ata_disk.tmp
        fi
        # SCSI device
        if [ ${all_disks} = "da1" ]
        then
                # found 1 SCSI disk (da0 - disk, da1 - flash)
                echo " detected SCSI disks! "
                echo "da0" > ${tmp_dir}/scsi_disk.tmp
        else
                /usr/bin/touch ${tmp_dir}/scsi_disk.tmp
        fi
        # detecting - how many SCSI disks on machine
#       for ii in 0 1 2 3 4 5 6 7 8 9
#       do
#               if [ ${all_disks} = da${ii} ]
#               then
#                       # count $i + 1 - line in file
##                      echo da${ii} >> ${tmp_dir}/disks_count.tmp
#               fi
#       done
        # up counter +1
        i="`/bin/expr $i + 1`"
done
#number_SCSI_disks="`cat ${tmp_dir}/disks_count.tmp | /usr/bin/wc -l | /usr/bin/tr -d ' '`"
#if [ ${debug} -eq 1 ] ; then
#echo "DEBUG: 2. number SCSI disks = ${number_SCSI_disks}" ; fi
# if $number_SCSI_disks = 1 - exit - only flash detected
#if [ ${number_SCSI_disks} -eq 1 ]
#then
        # exit
#       echo " Fatal: SCSI disks not detected!"
#       exit;
#fi
# scsi disks detected. da0 - disk for work

# disk counter. Current - number disk = 2; else - shutdown - error - no disks
# future - number disk = 3 (add RAM disk)
if [ $i -eq 2 ]
then
        # all OK
else
        # no disks?
        echo " HDD drive not found... System shutdown..."
        /bin/sleep 5 && /sbin/shutdown -p now && exit;
fi
# select disk for work
if [ `/usr/bin/wc -l ${tmp_dir}/ata_disk.tmp | awk '{print $1}'` -eq 1 ]
then
        # found ATA disk
        work_device="`/bin/cat ${tmp_dir}/ata_disk.tmp`"
else
        # ATA not found - work on SCSI
        work_device="`/bin/cat ${tmp_dir}/scsi_disk.tmp`"
fi

#exit
# fdisk
echo "Creating partitions..."
#/sbin/fdisk -f ${dist_dir}/fdisk.config -b -I -v /dev/da0 >/dev/null 2>&1
/sbin/fdisk -I -i -B /dev/${work_device}

echo "# /dev/${work_device}s1:
8 partitions:
#       size    offset  fstype  [fsize  bsize   bps/cpg]
a:      ${root_size}M   0       4.2BSD  2048    16384   32776
b:      ${swap_size}M   *       swap
c:      *       0       unused  0       0               # "raw" part, don't edit
d:      ${usr_size}M    *       4.2BSD  2048    16384   28528
e:      ${var_size}M    *       4.2BSD  2048    16384   28528
f:      *               *       4.2BSD  2048    16384   28552   # /shares - all remaining space
" > ${tmp_dir}/bsdlabel.txt

# bsdlabel
/sbin/bsdlabel -R ${work_device}s1 ${tmp_dir}/bsdlabel.txt >/dev/null 2>&1
/sbin/bsdlabel -B ${work_device}s1 >/dev/null 2>&1
# newfs
echo "Creating filesystems..."
/sbin/newfs /dev/${work_device}s1a      >/dev/null 2>&1 # /
/sbin/newfs /dev/${work_device}s1f      >/dev/null 2>&1 # /shares
/sbin/newfs /dev/${work_device}s1d      >/dev/null 2>&1 # /usr
/sbin/newfs /dev/${work_device}s1e      >/dev/null 2>&1 # /var
# tunefs
echo "Settings filesystems parameters..."
/sbin/tunefs -n enable /dev/${work_device}s1f   >/dev/null 2>&1 # softupdates
/sbin/tunefs -a enable /dev/${work_device}s1f   >/dev/null 2>&1 # ACLs
/sbin/tunefs -n enable /dev/${work_device}s1d   >/dev/null 2>&1 # softupdates
/sbin/tunefs -n enable /dev/${work_device}s1e   >/dev/null 2>&1 # softupdates

# restore /
echo "Restoring '/' filesystems..."
/sbin/mount /dev/${work_device}s1a /mnt
cd /mnt
/usr/bin/bunzip2 --stdout ${dist_dir}/root.dump.bz2 | /sbin/restore -rf -       >/dev/null 2>&1
# restore /usr
echo "Restoring '/usr' filesystems..."
/sbin/mount /dev/${work_device}s1d /mnt/usr
cd /mnt/usr
/usr/bin/bunzip2 --stdout ${dist_dir}/usr.dump.bz2 | /sbin/restore -rf -        >/dev/null 2>&1
# restore /var
echo "Restoring '/var' filesystems..."
/sbin/mount /dev/${work_device}s1e /mnt/var
cd /mnt/var
/usr/bin/bunzip2 --stdout ${dist_dir}/var.dump.bz2 | /sbin/restore -rf -        >/dev/null 2>&1
# restore /shares
echo "Restoring '/shares' filesystems..."
/sbin/mount /dev/${work_device}s1f /mnt/shares
cd /mnt/shares
/usr/bin/bunzip2 --stdout ${dist_dir}/shares.dump.bz2 | /sbin/restore -rf -     >/dev/null 2>&1

echo "All filesystems restored!"

# sync disks
sync
# end debug
#fi

# extract interface name (short; up)
for interface in `/sbin/ifconfig -l -u`
do
        # test interface name
        if [ ${interface} = "lo0" ]
        then
                # none
        else
                interface_name="${interface}"
        fi
done

# применяем введённые данные
# редактируем конфиги
echo "Applying new settings..."
for config in "etc/rc.conf" "etc/hosts" "usr/local/etc/exim/configure"
do
# server name
/usr/bin/sed -e "s/testsrv/${server_name}/g" /mnt/${config} \
        > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/${config}
# server IP
/usr/bin/sed -e "s/172.31.0.10/${server_IP}/g" /mnt/${config} \
        > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/${config}
# router IP $gateway_IP
/usr/bin/sed -e "s/172.31.0.1/${gateway_IP}/g" /mnt/${config} \
        > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/${config}
done
# smb.conf
server_name_UPPER="`echo ${server_name} | /usr/bin/tr '[:lower:]' '[:upper:]'`"
/usr/bin/sed -e "s/TESTSRV/${server_name_UPPER}/g" /mnt/usr/local/etc/smb.conf \
        > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/usr/local/etc/smb.conf
# Admin_testfil
/usr/bin/sed -e "s/admin_testfil/${user_login}/g" /mnt/usr/local/etc/smb.conf \
        > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/usr/local/etc/smb.conf
# filial OU (in AD)
/usr/bin/sed -e "s/testfil/${filial_OU}/g" /mnt/usr/local/etc/exim/includes/filials_macros.conf \
        > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/usr/local/etc/exim/includes/filials_macros.conf

# emai alias for admin
echo "" >> /mnt/etc/aliases
echo "#filial admin email" >> /mnt/etc/aliases
echo "${user_login}:    ${user_login}@my-domain-name.local" >> /mnt/etc/aliases
/usr/bin/sed -e "s/lissyara,dag/lissyara,dag,${user_login}/g" /mnt/etc/aliases \
        > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/etc/aliases

# settings for backup server
/usr/bin/sed -e "s/da0/${work_device}/g" /mnt/etc/fstab \
        > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/etc/fstab
if [ ${server_type} -eq 2 ]
then
        /usr/bin/sed -e "s/bce0/${interface_name}/g" /mnt/etc/rc.conf \
                > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/etc/rc.conf
        /usr/bin/sed -e "s/dovecot_enable=\"YES\"//g" /mnt/etc/rc.conf \
                > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/etc/rc.conf
        /usr/bin/sed -e "s/squid_enable=\"yes\"//g" /mnt/etc/rc.conf \
                > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/etc/rc.conf
        /bin/cp ${dist_dir}/exim.conf /mnt/usr/local/etc/exim/configure
        /usr/bin/sed -e "s/clamav_clamd_enable=\"YES\"//g" /mnt/etc/rc.conf \
                > ${tmp_dir}/tmp.config && /bin/mv ${tmp_dir}/tmp.config /mnt/etc/rc.conf
fi

sync

# debug - end skip restore
#fi

# new IP for jail
first_octet="`echo ${server_IP} | awk -F '.' '{print $1}'`"
second_octet="`echo ${server_IP} | awk -F '.' '{print $2}'`"
third_octet="`echo ${server_IP} | awk -F '.' '{print $3}'`"
fourth_octet="`echo ${server_IP} | awk -F '.' '{print $4}'`"
new_fourth_octet="`expr ${fourth_octet} - 1`"

alias_IP="${first_octet}.${second_octet}.${third_octet}.${new_fourth_octet}"

# alias - for jail
killall -9 dhclient >/dev/null 2>&1
sleep 1;
/sbin/ifconfig ${interface_name} inet ${server_IP} netmask 255.255.255.0
/sbin/ifconfig ${interface_name} alias ${alias_IP}
/sbin/route add default ${gateway_IP} >/dev/null 2>&1

# dev - for jail
/sbin/mount_devfs devfs /mnt/dev

# crating config for jail
#echo "# jails config
## Generic settings for JAILS
#jail_enable=\"YES\"
#jail_list=\"${server_name}\"
#jail_set_hostname_allow=\"YES\"
#jail_${server_name}_rootdir=\"/mnt\"
#jail_${server_name}_hostname=\"${server_name}\"
#jail_${server_name}_ip=\"${alias_IP}\"
#jail_${server_name}_procfs_enable=\"YES\"
#jail_${server_name}_devfs_enable=\"YES\"
#jail_${server_name}_flags=\"-l -U root\"

#" > /tmp/rc.conf.jail

# startting jails
#echo "starting jail for join in domain"
#/etc/rc.d/jail stop >/dev/null 2>&1
#/etc/rc.d/jail start >/dev/null 2>&1
#sleep 2;

# creating script for kinit
echo "#!/bin/sh
# killall services
#/usr/bin/killall -9 squid >/dev/null 2>&1
#/etc/rc.d/syslogd stop >/dev/null 2>&1
/bin/sleep 2
/usr/bin/kinit ${user_join_login}
" > /mnt/shares/tmp/kinit.sh
chmod 777 /mnt/shares/tmp/kinit.sh
# kerberos
echo "
Введите ВАШ доменный пароль для получения билета Kerberos:"
/usr/sbin/jail /mnt ${server_name} ${alias_IP} /shares/tmp/kinit.sh

# ifconfig down/up
#/sbin/ifconfig bce0 down
#sleep 1;
#ifconfig bce0 up
#sleep 1;

# creating script for net join
echo "#!/bin/sh
#/usr/local/etc/rc.d/samba restart >/dev/null 2>&1
sleep 1;
/usr/local/bin/net join -U ${user_join_login}
" > /mnt/shares/tmp/net_join.sh
chmod 777 /mnt/shares/tmp/net_join.sh
# join in domain
echo "
Введите ВАШ доменный пароль для ввода машины в домен:"
/usr/sbin/jail /mnt ${server_name} ${alias_IP} /shares/tmp/net_join.sh

# clear jail file
echo "# empty file" > /tmp/rc.conf.jail

echo "All done! Rebooting..."

# reboot
#/bin/sleep 5 && /sbin/shutdown -r now

exit;
Twitter Google Bookmarks Закладки Yandex БобрДобр.ru Memori.ru МоёМесто.ru

Shell Скрипты: сортировка фотографий

Скрипт сортирует фотографии по дате

#!/bin/bash

for i in `ls | grep -e ".*\.JPG$"`
do
    name=`echo "$i" | sed 's/JPG$/jpg/'`
    mv "$i" "$name"
done

for i in `ls | grep -i -e ".*\.JPEG$"`
do
    name=`echo "$i" | sed 's/JPEG$/jpg/'`
    mv "$i" "$name"
done

for i in *.jpg
do
    date=`exiv2 pr "$i" | grep "Image timestamp : " | sed 's/Image timestamp : //' | cut -d" " -f1 | sed 's/:/_/g'`
    echo "\"$i\" :=> $date"

    if [ -z "$date" ]
    then
        date=0000_00_00
    fi

    if [ ! -d "$date" ]
    then
        mkdir "$date"
    fi

    if [ -d $date ]
    then
        cp "$i" "$date"
    fi
done
Twitter Google Bookmarks Закладки Yandex БобрДобр.ru Memori.ru МоёМесто.ru

Shell Скрипты: Генерация команд для cisco

#!/bin/bash

#
# Last modifyed @ 2007-02-05 @ 22:17
#
# Purpose:
#       script generates Cisco router commands.
#       Creates DHCP pool with IP addresses from 192.168.x.0/24 - one pool per VLAN
#       Excludes address 192.168.x.1 from DHCP assign
#       Creates subinterface on dot1Q trunk interface f0/1 to match selected VLAN and
#       assignes 192.168.x.1 address to this subinterface.
#
# Commands should be issued in configure terminal mode.

if [ $# -ne 2 ]
then
    echo "Missing arguments"
    echo "Usage: $0 startVlanID endVlanID"
    exit
fi

dns1="193.232.88.17"
dns2="194.84.23.125"

st=$1
end=$2

cnt=$st
while [ 1 ]
do
    echo "VLAN ID: $cnt"
    echo -n "Enter group description: "
    read desc
    echo "================================"

    # Subinterface creation code
    echo "int f0/1.${cnt}"
    echo "description ${desc}"
    echo "encapsulation dot1Q ${cnt}"
    echo "ip addr 192.168.${cnt}.1 255.255.255.0"
    echo "no snmp trap link-status"
    echo "no shut"
    echo "exit"
    echo ""

    # DHCP pool creation code
    echo "ip dhcp excluded-address 192.168.${cnt}.1"
    echo "ip dhcp pool ${desc}"
    echo "network 192.168.${cnt}.0 /24"
    echo "domain ${desc}"
    echo "dns ${dns1} ${dns2}"
    echo "default-router 192.168.${cnt}.1"
    echo "exit"
    echo ""

    # NAT pool creation - Inside Global Addresses Overloading
    echo "int f0/1.${cnt}"
    echo "ip nat inside"
    echo "ip access-group 13 out"
    echo "exit"
    echo ""

    echo "================================"
    cnt=`expr $cnt + 1`
    if [ $cnt -gt $end ]
    then
        break;
    fi
done
Twitter Google Bookmarks Закладки Yandex БобрДобр.ru Memori.ru МоёМесто.ru

Shell скрипты: Статистика интернета

Данный скрипт проверяет есть или нет интернет и если его нету, то записывает время и дату его отсутствия.

#! /bin/sh
ping="/sbin/ping"
# часы
date_time="`date +%H:%M:%S`"
# дата
date="`date +%d-%m-%Y`"
# часы минуты
date_hour="`date +%H`"
date_minute="`date +%M`"

# Пингуемые хосты
ISP="xxx.xxx.xxx.xxx"

# Создание файлов если их нет
if [ ! -f hour.txt ]; then
echo "$date_hour" > hour.txt
echo "$date_minute" > minute.txt
echo "" > interval.txt
fi

# Пингуем провайдера
$ping -q -c 4 ${ISP} >/dev/null 2>&1

# если результат равен 0 (true)
if [ $? -eq 0 ]; then
    echo "Провайдер Lecos - $ISP доступен."
    exit 0;
else
        echo "Ошибка связи. Провайдер Lecos - $ISP не доступен"2>/dev/null 1>&2
        # Последнее время проверки
        old_hour="`cat hour.txt`"
        old_minute="`cat minute.txt`"

        # Текущая разница времени
        end_hour="`expr $date_hour - $old_hour`"
        end_minute="`expr $date_minute - $old_minute`"

        echo "-------------------------------
        Дата:  $date
        Время: $date_time
        Время отсутствия: ${old_hour}:${old_minute} - ${date_hour}:${date_minute}
        Всего $end_hour часов $end_minute минут.
        -------------------------------" >> interval.txt
            # Интервалы отсутствия времени
            interval="`cat interval.txt`"
            echo "$date_hour" > hour.txt
            echo "$date_minute" > minute.txt
            echo
            echo "Интервалы времени отсутствия Интернета:   "
            echo "$interval"
exit 1;

fi
Twitter Google Bookmarks Закладки Yandex БобрДобр.ru Memori.ru МоёМесто.ru

Shell Скрипты: проверка существования файлов

Скрип проверяет физическое наличие установленных пакетов описанных в БД пакетов для FreeBSD

#!/bin/sh

# pkg
pkg_db="/var/db/pkg"
pkg_preffix="/usr/local"

cd ${pkg_db}
ls | grep -v pkgdb.db |
{
while read pkg_name
do
        grep -v ^@ "${pkg_name}/+CONTENTS" |
        {
                while read file_name
                do
                # test - file exist?
                if test -r ${pkg_preffix}/${file_name}
                then
                        # exist
                else
                        # not exist
                        echo "corrupt pkg ${pkg_name} (file=${pkg_preffix}/${file_name})"
                fi
                done
        }

done
}
Twitter Google Bookmarks Закладки Yandex БобрДобр.ru Memori.ru МоёМесто.ru

Shell Скрипт: Переключение между каналами

Скрипт переключает между каналами интернета :)

#! /bin/sh

route="/sbin/route"
ping="/sbin/ping"
natd="/sbin/natd"
sleep="/bin/sleep"
killall="/usr/bin/killall"
touch="/usr/bin/touch"

# внешние сетевые карты
lan_isp1="rl0"
lan_isp2="rl1"

GW1=194.242.118.61
GW2=83.218.237.45

$ping -q -c 2 $GW1 > /dev/null 2>&1

# Если код завершения пинга 1 = error
if [ $? !=0 ]; then
        # пингуем второй канал
        $ping -q -c 2 $GW2 > /dev/null 2>&1
        # если код завершение true =0
        if [ $? =0 ]; then
                # Если файла gw2.changed нет, создаем его.
                # Он определяет переход на основной канал,
                # даже если есть и резервный
                # GW2 будет маршрутом по умолчанию
                if [ ! -f /tmp/gw2.changed ]; then
                $route delete default
                $killall natd
                $route add default $GW2
                $touch /tmp/gw2.changed
                $sleep 15
                $natd -n ${lan_isp2}
                . /etc/fwrules2.sh
                exit 0;
                fi
        else
                echo "Оба канала не доступны";
                exit 1;
        fi
else
        # Если пинганулся первый шлюз
        # Если файл gw2.changed найден, удаляем его
        # GW1 будет маршрутом по умолчанию
        if [ -f /tmp/gw2.changed ]; then
                $route delete default
                $killall natd
                $route add default $GW1
                $rm /tmp/gw2.changed
                $sleep 15
                $natd -n ${lan_isp1}
                . /etc/fwrules1.sh
                exit 0;
        fi
        echo "Основной канал работает и установлен по умолчанию";
        exit 0;
fi
Twitter Google Bookmarks Закладки Yandex БобрДобр.ru Memori.ru МоёМесто.ru

Shell Скрипты: /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
Twitter Google Bookmarks Закладки Yandex БобрДобр.ru Memori.ru МоёМесто.ru

Shell Скрипты: ограничиваем доступ к FTP

Данный скрипт с помощью фаервола ограничивает доступ к FTP на период с 21:00 до 4:00. Скрипт написан для ОС FreeBSD, но думаю переделать скрипт под iptables не проблема ;-)

#! /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;
Twitter Google Bookmarks Закладки Yandex БобрДобр.ru Memori.ru МоёМесто.ru

Shell Скрипты: ограничиваем объем скачанного

Это очень простой скрипт для ограничения скачанного ;-) ограничивает трафик и кого надо отрубает, описание ниже от автора :)

#!/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
Twitter Google Bookmarks Закладки Yandex БобрДобр.ru Memori.ru МоёМесто.ru