Архив Рубрики »Скрипты «

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 Скрипты: сортировка фотографий

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

#!/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

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

Всё просто, данный скрипт делает дамп системы ;)
Полезно :)

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