Борис Владимирович
Беляев




Скрипты sh, bash


Здесь представлениы спкипры которые я использую в своей работе


iptables.sh
#! /bin/sh
#
#######################
# Настройка интерфейсов
#######################

# Internet (Поменяйте на ваш интернет-интерфейс)
Inet_Interface="eth0"

# Lan (поменяйте на ваш интерфейс сетевогй карты)
Lan_Interface="eth1"

# Lo (локальный интефейс - петля)
Lo_Interface="lo"

# Описываем путь до iptables
IPT="/sbin/iptables"

# Определяем локальную подсеть и адрес сервера для перенаправления на squid
localNet="10.0.0.0/24"
serverSquid="10.0.0.1"

# Очищаем текущие правила (если вдруг есть какие-то правила)

$IPT -F
$IPT -t nat -F
$IPT -t mangle -F

$IPT -X
$IPT -t nat -X
$IPT -t mangle -X

# Задаем политики по умолчанию

$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT DROP

# Создаем цепочку для обработки неправильных пакетов.
# bad_packets

$IPT -N bad_packets

$IPT -A bad_packets -p tcp --tcp-flags SYN,ACK SYN,ACK -m conntrack --ctstate NEW -j REJECT --reject-with tcp-reset
$IPT -A bad_packets -p tcp \! --syn -m conntrack --ctstate NEW -j LOG --log-prefix "New not syn:"
$IPT -A bad_packets -p tcp \! --syn -m conntrack --ctstate NEW -j DROP

# Создаем цепочку для обработки входящих (из интернета) tcp соединений.
# tcp_p
$IPT -N tcp_p

# Чтобы, например, разрешить подключаться к нашему шлюзу из интернета по ssh:
ssh="22"
ssh_ip_allowed="192.168.0.0/24"

$IPT -A tcp_p -p tcp -s $ssh_ip_allowed --dport $ssh -j ACCEPT

$IPT -A tcp_p -p tcp -s 0/0 -j DROP

# Создаем цепочку для обработки входящих (из интернета) udp соединений.
# udp_p
$IPT -N udp_p

$IPT -A udp_p -p udp -s 0/0 -j DROP

# Создаем цепочку для обработки входящих (из интернета) icmp соединений.
# icmp_p
$IPT -N icmp_p

# Разрешаем "пинговать" наш шлюз из интернета:

$IPT -A icmp_p -p icmp -s 0/0 --icmp-type 8 -j ACCEPT
$IPT -A icmp_p -p icmp -s 0/0 --icmp-type 11 -j ACCEPT

$IPT -A icmp_p -p icmp -s 0/0 -j DROP

# Цепочка INPUT

$IPT -A INPUT -p tcp -j bad_packets

$IPT -A INPUT -p all -i $Lan_Interface -j ACCEPT
$IPT -A INPUT -p all -i $Lo_Interface -j ACCEPT

$IPT -A INPUT -p all -i $Inet_Interface -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -p tcp -i $Inet_Interface -j tcp_p
$IPT -A INPUT -p udp -i $Inet_Interface -j udp_p
$IPT -A INPUT -p icmp -i $Inet_Interface -j icmp_p

# Цепочка FORWARD

$IPT -A FORWARD -p tcp -j bad_packets

$IPT -A FORWARD -p all -i $Lan_Interface -j ACCEPT
$IPT -A FORWARD -p all -i $Lo_Interface -j ACCEPT
$IPT -A FORWARD -p all -i $Inet_Interface -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Цепочка OUTPUT

$IPT -A OUTPUT -p tcp -j bad_packets

$IPT -A OUTPUT -p all -o $Inet_Interface -j ACCEPT
$IPT -A OUTPUT -p all -o $Lan_Interface -j ACCEPT
$IPT -A OUTPUT -p all -o $Lo_Interface -j ACCEPT

# Цепочка POSTROUTING (таблица nat)

$IPT -t nat -A POSTROUTING -o $Inet_Interface -j MASQUERADE

# заворачиваем пакеты на 80 и 8080 порты на прокси. У кого нет - строчку удаляем.
$IPT -t nat -A PREROUTING -i $Lan_Interface \! -d $localNet -p tcp \
     -m multiport --dport 80,8080 -j DNAT --to $serverSquid:3128

# Включаем перенаправление ipv4.

echo "1" > /proc/sys/net/ipv4/ip_forward

echo "Firewall started"

exit 0

gtTest.sh
#!/bin/bash
#Список хостов для проверки
HOSTS="ya.ru google.com trion.mk.ua"
#Количество итераций для пинга
N=3

#Подсеть локального сегмента
LAN0="192.168.0.1"
LAN1="10.0.0.0/24"

#Адрес yполучателя отчета
EMAIL="borisbelyaev@mail.ru"

#Переменные пути и названия файлов
PWD="/var/test"
FILE="test.txt"

{
echo
echo "Test date:" `date`
echo

for H in $HOSTS
do
     PING=`ping -c$N $H | tail -n 2 | head -n 1 | cut -b24`
     let "NGOOD=$N / 3"
     if [ -n "$PING" ]
     then
         if [ $PING -ge $NGOOD ]
         then
             echo "Were $PING ping on host $H"
         else
             echo "Ping on host $H = failed"
         fi
     else
         echo $PING
     fi
done

#определение своего IP адреса
MYIP=`wget -O - -q icanhazip.com`

echo
echo "WAN IP = $MYIP"

#nmap -sP $LAN | grep Host | cat >> $PWD/$FILE
#nmap -sP $LAN0
nmap -sP $LAN1

} > $PWD/$FILE

#отправляем данные на почту
mail -s "gate" $EMAIL < $PWD/$FILE

#показать результат
#cat $PWD/$FILE

exit 0

logToHtml.sh
#!/bin/bash

sourceFile_a="/var/log/apache2/access.log"
sourcefile_e="/var/log/apache2/error.log"
outFile_a="/home/boris/public_html/access.htm"
outFile_e="/home/boris/public_html/error.htm"

# Обработка файла логов доступа
{
echo "<html><table border=1>"

cat -n $sourceFile_a | tac | \
awk '\
{printf "\n\
<tr bgcolor='#0099CC' align='center'>\n\
     <td>%s</td>\n\
     <td>%s</td>\n\
     <td>%s %s</td>\n\
     <td>%s %s</td>\n\
     <td>%s %s %s %s %s %s %s %s</td>\n\
</tr>\n", $1, $2, $3, $4, $5, $6, $13, $14, $15, $16 , $17, $18, $19, $20 }\

{printf "\n\
<tr>\n\
     <td></td>\n\
     <td>Request (ont): </td>\n\
     <td colspan='3'>%s %s %s %s</td>\n\
</tr>\n", $7, $8, $9, $10 }\

{printf "\n\
<tr>\n\
     <td></td>\n\
     <td>Response (in): </td>\n\
     <td align='center'>%s</td>\n\
     <td colspan='2'>%s</td>\n\
</tr>\n\n", $11, $12 }'

echo "</table>"
} > $outFile_a

# Обработка Файла лога ошибок
{
echo "<html><table border=1>"

cat -n $sourcefile_e | tac | \
awk '\
$2 ~ /^\[/ && $7 ~ /notice/ {printf "<tr bgcolor='#FFFFCC'>\n\
         <td>%s</td>\n\
         <td>%s %s %s %s %s</td>\n\
         <td>%s</td>\n\
         <td>%s %s %s %s</td>\n\
         <td>%s %s %s %s %s %s</td>\n\
     </tr>\n\n", $1, $2, $3, $4, $5, $6 , $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18 }\

$2 ~ /^\[/ && $7 ~ /error/ {printf "<tr bgcolor='#CC6633'>\n\
         <td>%s</td>\n\
         <td>%s %s %s %s %s</td>\n\
         <td>%s</td>\n\
         <td>%s %s</td>\n", $1, $2, $3, $4, $5, $6 , $7, $8, $9;\
         printf "<td>";\
             for (i=10; i<=NF; i++) printf "%s ", $i;\
         printf "</td>\n</tr>\n\n"}\

$2 ~ /^\[/ && $7 ~ !/error/ && $7 ~ !/notice/ {printf "<tr bgcolor='#FFFFFF'>\n\
         <td>%s</td>\n\
         <td>%s %s %s %s %s</td>\n\
         <td>%s</td>\n\
         <td>%s %s %s %s</td>\n\
         <td>%s %s %s %s %s %s</td>\n\
     </tr>\n\n", $1, $2, $3, $4, $5, $6 , $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18 }\

$2 ~ /PHP/ {printf "<tr bgcolor='#CCCCCC'>\n\
         <td>%s</td>\n", $1;\
         printf "<td colspan='4'>";\
             for (j=2; j<=NF; j++) printf "%s ", $j;\
         printf "</td>\n</tr>\n\n"}'

echo "</table></html>"
} > $outFile_e

hosrTest.sh
#!/bin/bash
# hosrTest.sh
# Отправка электронной посты

# Какие хосты тестировать
serverTest="r-info.net bvb.mk.ua"

{
date

for nameServ in $serverTest
do
     echo "Server $nameServ"
     (sleep 2
     echo "HEAD / HTTP/1.0"
     echo
     sleep 2) |\
         nc $nameServ 80 2>/dev/null | grep "HTTP/.*\..* 200 OK" |\
         awk 'BEGIN{k=0}{if ($0~" 200 OK") k=1}
         END{if (k==0) print "NOT available!!!";
             else print "available."}'
done
} > ./hostTest.txt

# Отобразить на экране
cat ./hostTest.txt

# Отправляем на почту используем скрипт sMail.sh находящейся в том же каталоге (для теста)
# sMail.sh можно поместить в /usr/local/bin/
./sMail.sh hostTest.txt

sMail.sh
#!/bin/bash
# sMail.sh
# Скрипт отправляет заданный текстовый файл раскрывая его в тело письма
#+на указанный адрес электронной почты.

# Список mail серверов
mailServer="mail.hostopia.com bvb.mk.ua"

# От кого
host=`hostname`
mailFrom="root@$host"

# Номера ошибок
E_NOARGS=65
E_NOTFOUND=66

if [ $# -lt 2 ]
then
     echo "Использование: `basename $0` имя_пересылаемого_файла кому_электронка" >&2
     # Сообщение об ошибке направляем в stderr.
     exit $E_NOARGS
     # Скрипт возвращает значение 65 (код ошибки).
fi

# Файл который посылаем
sFile="$1"

if [ ! -f "$sFile" ]
then
     echo "Файл $sFile не найден!" >&2
     # Сообщение об ошибке направляем в stderr.
     exit $E_NOTFOUND
     # Скрипт возвращает значение 66 (код ошибки).
fi

textMail=`cat $sFile`

# Кому
mailTo="$2"

for server in $mailServer
do
     # Проверяем доступен ли mail сервер
     availServer=`(sleep 2 && echo "quit") | nc $server 25 | cut -f1 -d" "`
     if [ "$availServer" != "220" ]
     then
         # Если сервер не доступен пропускаем его
         continue
     else
         # Соединяемся с сервером с помощью netcat или telnet на порт 25 и пересылаем файл
         (sleep 3
         echo "helo gate"
         sleep 2
         echo "mail from: <$mailFrom>"
         sleep 2
         echo "rcpt to: <$mailTo>"
         sleep 2
         echo "data"
         sleep 2
         echo "$textMail"
         echo "."
         sleep 2
         echo "quit") |\
             nc $server 25

         break
     fi
done

exit 0