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

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

Непрочитанное сообщение Alex Keda » 2007-07-10 12:56:46

скрипт для использования утилиты

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

router# cd /usr/ports/
router# make search name='colori'
Port:   colorize-0.3.4
Path:   /usr/ports/sysutils/colorize
Info:   A robust log colorizer
Maint:  ports@FreeBSD.org
B-deps: perl-5.8.8
R-deps: p5-Term-ANSIColor-1.11 perl-5.8.8
WWW:    http://colorize.raszi.hu/

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

router# more /root/tail.sh
#!/bin/sh

/usr/bin/tail $@ | /usr/local/bin/colorize
в .cshrc - альяс

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

alias tail      /root/tail.sh
удобно :)
Убей их всех! Бог потом рассортирует...

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

gyurza2000
лейтенант
Сообщения: 895
Зарегистрирован: 2007-07-08 23:53:20
Откуда: SPb
Контактная информация:

Непрочитанное сообщение gyurza2000 » 2007-07-10 13:13:21

значит не поможете делом...только словом?

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

Непрочитанное сообщение Alex Keda » 2007-07-10 13:54:31

делать за тебя никто ничего не будет.
У всех своя работа, как и у тебя.
Убей их всех! Бог потом рассортирует...

gyurza2000
лейтенант
Сообщения: 895
Зарегистрирован: 2007-07-08 23:53:20
Откуда: SPb
Контактная информация:

Непрочитанное сообщение gyurza2000 » 2007-07-10 14:10:30

да не, я не о том, я думал у кого нить готовое решение есть, которое нужно только подрихтовать под себя :)

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

Непрочитанное сообщение schizoid » 2007-07-10 14:40:52

у меня есть ;)
NeTAMS называеццо ;)
осталось тока подрихтовать под себя :)
http://netams.com/
ядерный взрыв...смертельно красиво...жаль, что не вечно...

gyurza2000
лейтенант
Сообщения: 895
Зарегистрирован: 2007-07-08 23:53:20
Откуда: SPb
Контактная информация:

Непрочитанное сообщение gyurza2000 » 2007-07-10 16:01:28

Раз уж про биллинг: netams, cnupm, ipacctd, ng_ipacct, TC, trafficwatch и есть ещё куча других анализаторов логов и считалок трафика. Что выбрать? Что бы попроще в конфигурировании, а из задач - только обрубание трафика по достижении квоты в 2 Гб, с оставлением трафика на единственной машине.

P.S.
И ещё, надо что б всё это жило с IPFW, Squid и Rejik

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

Непрочитанное сообщение o2x » 2007-07-10 16:53:27

Обычно смотрю так, без всяких скриптов.
Шел tcsh.

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

tail -f /var/log/all.log | colorize
Неплохой биллинг SAcc

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

Непрочитанное сообщение Alex Keda » 2007-07-10 18:50:39

так удобней. юзаю нативный синтаксис tail - леплю трубы как хочу, а на выходе всё раскрашиваетсся :)
Убей их всех! Бог потом рассортирует...

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

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

Непрочитанное сообщение proxy-man » 2007-07-26 17:10:36

Мудохаюсь с одним таском :) - нужно было распарсить текстовый фал в несколько тысяч строк и вычленить из него IP-адреса. Ну собственно дело получилось, но в конечный результат попали так же "левые строки" for example: 90/1212121 etc... их было собственно таких строчек фигня, несколько десятков и решил я этот "последний промежуточный вариант" еще раз "пропарсить". Наваял такого рода скриптик:

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

# вытягиваем в отдельный массив "левые строки"
ARR=(`cat ./hp_ip.txt|awk '/90\//'|uniq`)
# используем цикл и перебираем каждый член массива на предмет
# его нахождения в исходном файле, а затем при помощи утилиты tr
# типа "стираем" строчки из STDOUT и запихиваем в другой файл уже 
# "чистые" строки
for STRING in ${ARR}; do
    tr -d ${STRING} < /usr/home/father/Desktop/hp_ip_f.txt > ./IPADD.txt
done
Однако в "другой файл" сыпется "мусор" - т.е tr -d стирает в "нормальных" строках кое-какие цифровые символы...
Может быть кто-то подтолкнет в нужном направлении, как сделать erase "левым" строкам?
ЗЫ0 - пытался процесс стирания реализовать через sed, типа sed '/^$PATTERN/d' - херасе :(
ЗЫ1 - понятно, что на perl-е будет цивильно, но я его еще хреновато знаю, могу делать только простые вещи ...
Have trouble with Windows - reboot,
Have trouble with Unix - be root!

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

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

Непрочитанное сообщение Alex Keda » 2007-07-26 18:34:34

кавычки одиносчные не надо - надо двойные - тогда седом получится.
============
а лучше отдельные темы заводить.
Убей их всех! Бог потом рассортирует...

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

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

Непрочитанное сообщение proxy-man » 2007-07-26 22:14:38

lissyara писал(а):кавычки одиносчные не надо - надо двойные - тогда седом получится.
============
а лучше отдельные темы заводить.
Сча испытаю sed-ом :)
ЗЫ - Лис, дык может в разделе про программинг вынесем отдельную тему типа shell-perl-скриптингS?
Have trouble with Windows - reboot,
Have trouble with Unix - be root!

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

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

Непрочитанное сообщение Alex Keda » 2007-07-27 0:22:23

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

Andy
ст. лейтенант
Сообщения: 1117
Зарегистрирован: 2007-03-04 7:48:58
Откуда: Mytischi

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

Непрочитанное сообщение Andy » 2007-07-27 8:15:27

Скорее это все-таки программинг, ибо алгоритмическое мышление присутствует, а инструмент реализации вторичен. Где опрос?
p.S: Хочу, что бы в опросе был мой любимый пункт (я его в недавнем опросе пропутил, потому как поздно заметил) - Хто Здеся? :lol:
Jul 16 19:37:15 freebsd sshd[4152]: Invalid user idiot from 210.75.200.104

Аватара пользователя
stomotolog
рядовой
Сообщения: 29
Зарегистрирован: 2007-07-27 8:57:57
Откуда: Италия

Перенос пользователей с Linux в FreeBSD

Непрочитанное сообщение stomotolog » 2007-07-27 9:19:47

Добрый день!
Стоял у нас старый RHEL3 необходимо было перенести всю почту на FreeBSD и пришлось наваять такой вот скрипт и дополнитеольно скачать mbox2mdir-1.3.

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

#!/usr/bin/perl -w

#use Expect;
#use IO

use Mail::Sendmail;
#use strict;

#Dobavlenie USERS iz bazi pol`zovateley

open(PASSWD_FILE,"/usr/local/script/post_perenos/test_shadow/shadow") || die "ERROR!!!";
while(<PASSWD_FILE>){
    ($name1,$password1) = split(":");
            system(`pw addgroup -n $name1`);
           system(`pw useradd -n $name1 -d /home/$name1 -g $name1 -G mail -m -s /usr/sbin/nologin`);
                   }

system(`cp /etc/master.passwd /usr/local/script/post_perenos/test_shadow/master.passwd`);


#Sozdanie password

open(MASTER_SHADOW_FILE,"/usr/local/script/post_perenos/test_shadow/master.passwd") || die "ERROR!!!";
$i=0;
while(<MASTER_SHADOW_FILE>){
chomp $_;

push(@password_massiv,$_);
$i++;
    }
close(MASTER_SHADOW_FILE);

open(PASSWD_FILE,"/usr/local/script/post_perenos/test_shadow/shadow") || die "ERROR!!!";
while(<PASSWD_FILE>){
($name,$password) = split(":");

for($j=0;$j<=$#password_massiv;$j++){
if($password_massiv[$j]=~m/^$name/){
#$password='*';
#$password_massiv[$j]=~s/^\$1\$[A-Za-z0-9]+/\*/;
    $password_massiv[$j]=~s/\*/$password/;
print "$password"."\n";
                }
        }
    }
#print "@password_massiv"."\n";
open(MASTER_SHADOW_FILE,">/usr/local/script/post_perenos/test_shadow/master.passwd");
for($k=0;$k<=$#password_massiv;$k++){
print MASTER_SHADOW_FILE "$password_massiv[$k]"."\n";
                }
close(MASTER_SHADOW_FILE);
close (PASSWD_FILE);
system(`cp /usr/local/script/post_perenos/test_shadow/master.passwd /etc/master.passwd`);
system(`pwd_mkdb /etc/master.passwd`);

#Zanosim pochtovie psevdonimi v obschuyu gruppovuyu rassilku "PUBLIC" (dlya togo chtobi sozdat` katalog MailDir)

#Dobavlenie stroki s imenami polzovateley v file "aliases"


open(MASTER_SHADOW_FILE,"/usr/local/script/post_perenos/test_shadow/shadow") || die "ERROR!!!";
$i=0;
while(<MASTER_SHADOW_FILE>){
            chomp $_;
            push(@password_massiv,$_);
            $i++;
#                       }
close(MASTER_SHADOW_FILE);

open(PASSWD_FILE,"/usr/local/script/post_perenos/test_shadow/shadow") || die "ERROR!!!";

system(`cp /usr/local/etc/postfix/aliases /usr/local/script/post_perenos/aliases`);

open(TEST_FILE, ">>/usr/local/script/post_perenos/aliases");
print TEST_FILE "public: ";
close (TEST_FILE);

open(TEST_FILE, ">>/usr/local/script/post_perenos/aliases");
while(<PASSWD_FILE>){
($name,$password) = split(":");
#print TEST_FILE "$name".", ";
#                   }
close (TEST_FILE);
close (PASSWD_FILE);
#
system(`cp /usr/local/script/post_perenos/aliases /usr/local/etc/postfix/aliases`);
system(`newaliases`);

Otsilka POCHTI ko vsem sozdannim psevdonimam

$mail{From} = 'Sendmail Test <atret@domain.ru>';

$mail{To}   = 'Sendmail Test <public@domain.ru>';
$server = '192.100.169.213';

BEGIN { $| = 1; print "1..2\n"; }
END {print "not ok 1\n" unless $loaded;}

#print <<EOT
Test Mail::Sendmail $Mail::Sendmail::VERSION 
#Trying to send a message to the author (and/or whoever if you edited test.pl)

#(The test is designed so it can be run by Test::Harness from CPAN.pm.
#Edit it to send the mail to yourself for more concrete feedback. If you
#do this, you also need to specify a different mail server, and possibly
#a different From: address.)

#Current recipient(s): '$mail{To}'

#EOT
#;

$loaded = 1;
print "ok 1\n";

if ($server) {
    $mail{Smtp} = $server;
            print "Server set to: $server\n";
                   }

                  $mail{Subject} = "Mail::Sendmail version $Mail::Sendmail::VERSION test";
                   $mail{Subject} = "Test MESSAGE from ADMINS!";

                   $mail{Message} = "Dear USER!!!";
                   $mail{Message} = "This is a test message sent with Perl version $] from a $^O system.\n\n";
                   $mail{Message} .= "It contains an accented letter: ` (a grave).\n";
                   $mail{Message} .= "It was sent on " . Mail::Sendmail::time_to_date() . "\n";

 Go send it
print "Sending...\n";

if (sendmail %mail) {
        print "content of \$Mail::Sendmail::log:\n$Mail::Sendmail::log\n";
        if ($Mail::Sendmail::error) {
        print "content of \$Mail::Sendmail::error:\n$Mail::Sendmail::error\n";
                    }
        print "ok 2\n";
                    }
        else {
        print "\n!Error sending mail:\n$Mail::Sendmail::error\n";
        print "not ok 2\n";
            }

#<> 
#Konvertaciya pochti polzovateley

open(PASSWD_FILE,"/usr/local/script/post_perenos/test_shadow/shadow") || die "ERROR!!!";
while(<PASSWD_FILE>){
($name,$password) = split(":");

for($j=0;$j<=$#password_massiv;$j++){
    system(`/usr/backup_mail/mbox2mdir-1.3/mbox2mdir /usr/backup_mail/27-10-2006/var/spool/mail/$name /usr/home/$name/MailDir/cur -t`);
        }
    }
system(`newaliases`);
<>
Кощеи бессмертны - пока Иванушки дураки!

Sw%00p
проходил мимо

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

Непрочитанное сообщение Sw%00p » 2007-07-30 8:39:43

нашёл скриптик в сисадмине для монтировки флешек
кто-нибудь проверьте у мня нет флешки )))))

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

#!/bin/sh
# Приложение 3
# Монтирование Flash устройств
# $Id: mountflash,v 1.4 2005/07/25 10:49:26 shelton Exp $

# Проверка задания точки монтирования. Если не задана, берется точка
# монтирования по умолчанию
if [ $# -lt 1 ]; then
  mpoint="/mnt/umass"
 else
   mpoint=$1
fi

# Подождать 1 секунду, пока usbd выполнит необходимые действия
sleep 1

# Подключение нового устройства всегда происходит на шину с максимальным номером
# Поэтому мы разбираем список, выдаваемый camcontrol devlist (по признаку ")")
# выбираем один символ из строки scbusX (шестой от начала строки), прибавляем
# пробел, составляем список и сортируем его по убыванию. Первый элемент списка
# будет шина, на которую подключилось устройство
umdevs=`camcontrol devlist | \
   awk 'BEGIN {RS=")"} {print substr($0,index($0,"scbus") + 5, 1) + " "}' | \
          sort -b -n -r`

# Берем первый элемент списка и увеличиваем его на единицу
umdev=`echo $umdevs | awk '{print $1}'`
ummax=$(($umdev+1))

# Если CAM еще не подключил устройство, пересканировать эту шину
camcontrol rescan $ummax 2> /dev/null

# Если рескан шины завершился неуспешно, значит CAM уже подключил устройство
# и оно находится на шине с выбранным максимальным номером
if [ $? -ne 0 ]; then
  ummax=$umdev
fi

# Получаем еще раз список устройств и отбираем нужную шину
umdrive=`camcontrol devlist | grep -e "scbus$ummax"`

# Определяем имя устройства. Ищем в выводе строку "(da" и выбираем подстроку
# cо второго символа (пропускаем скобку) в три символа: 
# <Generic Flash Disk 7.77> at scbus3 target 0 lun 0 (da0,pass3)
umdevs=`echo $umdrive | awk '{print substr($0,index($0,"(da") + 1,3)}'`

# Составляем полное имя устройства
devfull="/dev/"$umdevs"s1"

# Проверяем наличие такого файла в /dev. DEVFS создает файлы устройств с
# некоторой задержкой, так что ждем до тех пор, пока он не появится
sleep 1

while [ ! -e $devfull ];
 do
  sleep 1
 done

# Монтируем, наконец, Flash. Включаем поддержку длинных имен и указываем
# как перекодировать имена файлов на русском языке
mount_msdosfs -l -L ru_RU.KOI8-R -D CP866 $devfull $mpoint

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

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

Непрочитанное сообщение Alex Keda » 2007-07-30 8:50:51

как-то сложно...
проще через

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

sysctl kern.disks
находить устройство...
Убей их всех! Бог потом рассортирует...

Аватара пользователя
V1talya
мл. сержант
Сообщения: 122
Зарегистрирован: 2007-07-23 9:36:52
Откуда: г. Нерюнгри
Контактная информация:

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

Непрочитанное сообщение V1talya » 2007-08-02 18:18:54

А нету не у кого скрипта автоматического обновления портов ?

( что б после обновления портов смотрел какие пакеты нужно обновить и обновлял их по очереди )
( Вроде где-то тут такое находил или может мне показалось ? )
( Написал бы сам ( уже пробую но что-то не так работает ) но sh не знаю вообще )
Debian GNU/Linux 4.0
FreeBSD 6.2

Аватара пользователя
Dog
лейтенант
Сообщения: 723
Зарегистрирован: 2006-09-21 10:34:36
Откуда: Kharkiv, Ukraine
Контактная информация:

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

Непрочитанное сообщение Dog » 2007-08-03 12:17:24

Полезный совет из личного опыта: НИКОГДА не обновляй порты автоматом! Можешь скормить крону ежедневный csup - но перед portupgrade'ом глянь на всякий случай /usr/ports/UPDATING...
Oh my God, they killed init! Bastards!

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

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

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

Скрипт для периодического включения/выключения огранияения коннектов с одного адреса

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

more /backup/scripts/disable_src_limit.sh
#!/bin/sh

# variables
max_la="4" # Load Averages when start antiflood
main_email="admin@lissyara.su"

mail="/usr/bin/mail"
uptime="/usr/bin/uptime"
awk="/usr/bin/awk"

# get Load Averages
la="`${uptime} | ${awk} -F 'averages:' '{print $2}' | \
        ${awk} '{print $1}' | ${awk} -F '.' '{print $1}'`"
#echo $la

# if la > 2 - set ipfw src-limit, else - unset
if [ ${la} -ge ${max_la} ]
then
        /usr/local/etc/rc.d/antiflood.sh start >/dev/null 2>&1
        echo "Antiflood start!" | ${mail} -s \
                antiflood_on_`/bin/hostname`_started ${main_email} >/dev/null 2>&1
else
        /usr/local/etc/rc.d/antiflood.sh stop >/dev/null 2>&1
#       echo "Antiflood stop!" | ${mail} -s \
#               antiflood_on_`/bin/hostname`_stopped ${main_email} >/dev/null 2>&1
fi
и второй, которым управляет перый

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

more /usr/local/etc/rc.d/antiflood.sh
#!/bin/sh

# rewritten by lissyara 2007-07-31 in 23:25

case "$1" in
start)
        # added by lissyara 2007-07-21 in 23:30
        /sbin/ipfw delete 1 1800 1900 2000 2100
        #/sbin/ipfw -q flush

        # added by lissyara 2007-07-19 in 00:55
        /sbin/ipfw add 1 allow all from any to any via lo0

        # added by lissyara 2007-07-21 in 23:30
        /sbin/ipfw add 1800 allow tcp from me to 87.240.15.4
        /sbin/ipfw add 1900 allow tcp from 87.240.15.4 to me

        /sbin/ipfw add 2000 allow tcp from any to me 80 limit src-addr 10
        /sbin/ipfw add 2100 allow tcp from any to me 25 limit src-addr 5

        ;;
stop)
        /sbin/ipfw delete 2000 2100

        ;;
*)
        echo "usage: `basename $0` {start|stop}"

        ;;
esac

exit 0;
собственно изобретательство это от моей тупизны - как ни бился не смог настроить нормальную работу limit src-addr на высоких нагрузках - несколько дней работы, несколько тысяч авдресов таблице динамических правил - и сервер говорит всем привет. Когда таблица очистится по таймауту - снова становится доступен.
Предупреждая вопросы - протюнил в sysctl всё - и время жизни правила и число правил и весь стек :(((
Убей их всех! Бог потом рассортирует...

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

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

Непрочитанное сообщение o2x » 2007-08-08 22:07:36

Маленький скриптец для удаленного входа на фтп, и соответствующих действий на нем.

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

#!/bin/sh

# remote ftp host,user,pass 
ftp_host="xxx.xxx.xxx.xxx"
ftp_user="anonymous"
ftp_passwd="anonymous@localhost"
# remote file
remote_file1="film.avi"

# -n no avto-login
ftp -n ${ftp_host} << EOF
user ${ftp_user} ${ftp_passwd}
cd Incoming
get $remote_file1
quit

EOF 
Если используется прокси:

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

# vim /usr/local/etc/wgetrc
http_proxy = http://user:pass@192.168.0.11:3128
ftp_proxy = http://user:pass@192.168.0.11:3128
use_proxy = on 
или
shell:

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

setenv HTTP_PROXY http://user:pass@192.168.0.11:3128
setenv FTP_PROXY http://user:pass@192.168.0.11:3128

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

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

Непрочитанное сообщение o2x » 2007-08-10 10:47:49

Принудительное скачивание через wget

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

#!/bin/sh

#path to programm
wget="/usr/local/bin/wget"
# options wget
# -T таймаут на проблемы соединений
# -c докачать файл
# -b background
# -t 0 (0 - безлим) колличество скачиваний
wget_options="-T 600 -t 0 -c "

# файлы для закачки
files_to_download="
http://ftp.fora.org/pub/Sample1.img
http://ftp.fora.org/pub/Sample2.img
http://ftp.fora.org/pub/Sample3.img
"

while true
do

 for file in ${files_to_download}
 do
 # закачка файла
 $wget ${wget_options} $file
 done

 # если закачаны все файлы, выход
 if [ $?=0 ] ; then
 break 2;
 fi

done

exit 0;


Andy
ст. лейтенант
Сообщения: 1117
Зарегистрирован: 2007-03-04 7:48:58
Откуда: Mytischi

Re:

Непрочитанное сообщение Andy » 2007-08-26 7:16:29

o2x писал(а):Переключение между каналами:

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

#! /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
Хороший скрипт, спасибо. Немного его видоизменил и приспособил под
pf, ибо его и использую, а еще скрипт не использует файл в качестве определения
основного канала файл /tmp/gw2.changed.

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

#! /bin/sh
route="/sbin/route"
ping="/sbin/ping"
pfctl="/sbin/pfctl"
grep="/usr/bin/grep"
awk="/usr/bin/awk"  

GW1=192.168.0.170
GW2=192.168.0.207

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

if [ $? != 0 ]; then 
  echo "Канал ${GW1} не работает"
    $ping -q -c 2 $GW2 > /dev/null 2>&1
      if [ $? != 0 ]; then 
         echo "Канал ${GW2} тоже не работает."
         exit 1;
      fi     
         $route delete default
         $route add default $GW2 
         $pfctl -f /etc/pf2.conf
         echo "Теперь используется канал ${GW2}"
         exit 0;
else 
         $route -n get default | grep gateway | awk '{print$2}'
          if [ $? != $GW1 ]; then 
           $route delete default
           $route add default $GW1 
           $pfctl -f /etc/pf.conf
           echo "Вернулись на основной канал ${GW1}"
          else 
            echo  "Основной канал работает!"
          fi  

fi
Jul 16 19:37:15 freebsd sshd[4152]: Invalid user idiot from 210.75.200.104

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

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

Непрочитанное сообщение Alex Keda » 2007-09-12 8:50:21

подпорка. mysql периодически начинает заниматься чем-то своим, занимая весь проц...
вот нарисовал - проверяет, если три проверки подряд пожрало весь проц - рестартует.
в крон - раз в минуту и всё

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

hosting# more /root/.mysql_restart.sh
#!/bin/sh

# memory file
memory="/tmp/.mysql.load"
tmp_file="/tmp/.mysql.tmp.file"
source_la="0"
la_count="3"
max_la="97"

# variables
top="/usr/bin/top"
grep="/usr/bin/grep"
awk="/usr/bin/awk"
cat="/bin/cat"
tail="/usr/bin/tail"
expr="/bin/expr"

# пишем загрузку
${top} -n | ${grep} mysqld | ${awk} '{print $10}' | \
        ${awk} -F '.' '{print $1}' >> ${memory}
# оставляем три последних значения
${cat} ${memory} | ${tail} -${la_count} > ${tmp_file}
${cat} ${tmp_file} > ${memory}

# считаем значения
${cat} ${memory} |
{
while read la
do
        # проверяем загрузку
        source_la="`${expr} ${source_la} + ${la}`"
        echo -n ${source_la} > ${tmp_file}
done
}

# la
source_la="`${cat} ${tmp_file}`"

if [ `${expr} ${source_la} / ${la_count}` -ge ${max_la} ]
then
        # муся молотит уже три минуты. рестартуем
        /usr/local/etc/rc.d/mysql-server.sh restart >/dev/null 2>&1
        echo "mysql restarted on hosting.gptel.ru" | /usr/bin/mail -s mysql lissyara
fi
Убей их всех! Бог потом рассортирует...

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

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

Непрочитанное сообщение schizoid » 2007-09-13 15:39:39

Нарезка скорости в МПД и проверка юзеров по мак-адресам
МПД настроен по стаье http://www.lissyara.su/?id=1350
Добавляем в таблицу radcheck 3 поля: mac1, mac2 и bw.
Почему 2 поля мак, потому что у некоторых пользователей дома по 2 ПК, и они подключаются в инет то по одному, то по второму (если у ваших юзеров больше, мона добавить и больше, тока нуно будет подправить скрипт)
поле bw содержит данные типа bw_all, bw_64 и bw_128 (это своего рода скоростные пакеты)
также добавляем табличку bw, где есть 3 поля (bw_all, bw_64 и bw_128), которые содержат параметры нарезки скорости, числовые (у мну 160, 64 и 128 соответственно).

далее сами скрипты:
#cat up.sh

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

#!/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
#номер правила
i=`/bin/echo "select id from freeradius.radcheck where Username='$5';" |mysql -s -uЮЗЕР -pПАРОЛЬ`
#пакет скорости интернета
bw=`/bin/echo "select bw from freeradius.radcheck where Username='$5';" |mysql -s -uЮЗЕР -pПАРОЛЬ`
date=`date "+%Y-%m-%d"`
#IP с которого подключается пользователь
r_ip=`/bin/echo "select CallingStationId from freeradius.radacct where Username='$5' and date(AcctStartTime)='$date' and AcctStopTime='0000-00-00 00:00:00' limit 1;" |mysql -s -uЮЗЕР -pПАРОЛЬ`
#MAC подключившегося пользователя
r_mac=`arp -n $r_ip|awk '{print $4}'`
#Выгребаем мак-адреса для данного пользователя из своей БД
mac1=`/bin/echo "select mac1 from freeradius.radcheck where Username='$5';" |mysql -s -uЮЗЕР -pПАРОЛЬ`
mac2=`/bin/echo "select mac2 from freeradius.radcheck where Username='$5';" |mysql -s -uЮЗЕР -pПАРОЛЬ`

echo "-------------------------" >> /usr/local/etc/mpd4/test
echo `date` >> /usr/local/etc/mpd4/test
if [ "$bw" = "bw_all" ]; then
	echo "0 start!" >> /usr/local/etc/mpd4/test
	s=`/bin/echo "select bw_all from freeradius.bw;" |mysql -s -uЮЗЕР -pПАРОЛЬ`
   else
	if [ "$bw" = bw_64 ]; then
	echo "1 start!" >> /usr/local/etc/mpd4/test
	s=`/bin/echo "select bw_64 from freeradius.bw;" |mysql -s -uЮЗЕР -pПАРОЛЬ`
	
   else
	echo "2 start!" >> /usr/local/etc/mpd4/test
	s=`/bin/echo "select bw_128 from freeradius.bw;" |mysql -s -uЮЗЕР -pПАРОЛЬ`
fi
fi

#проверка для последней цифры в номере фаервола
if [ "$i" -le 9 ]
  then
        n=0$i
  else
        n=$i
fi

echo "For user $5" >> /usr/local/etc/mpd4/test
echo "" >> /usr/local/etc/mpd4/test
#pipe's IN
echo "ipfw add 5$n pipe $i ip from any to $4" >> /usr/local/etc/mpd4/test
ipfw add 5$n pipe $i ip from any to $4
#pipe's OUT
echo "ipfw add 7$n pipe 1$n ip from $4 to any" >> /usr/local/etc/mpd4/test
ipfw add 7$n pipe 1$n ip from $4 to any
#pipe's speed
echo "ipfw pipe $i config bw "$s"Kbit/s queue 10" >> /usr/local/etc/mpd4/test
ipfw pipe $i config bw "$s"Kbit/s queue 10
echo "ipfw pipe 1$n config bw "$s"Kbit/s queue 10" >> /usr/local/etc/mpd4/test
ipfw pipe 1$n config bw "$s"Kbit/s queue 10
echo "" >> /usr/local/etc/mpd4/test

echo "Begin test for mac-adress's" >> /usr/local/etc/mpd4/test

if [ "$r_mac" = "$mac1" ]; then
    echo "0 Goot" >> /usr/local/etc/mpd4/test
    elif [ "$r_mac" = "$mac2" ]; then
	    echo "1 Goot" >> /usr/local/etc/mpd4/test
	    else 
		echo "Пользователь $5 подключился с чужого компьютера IP=$r_ip (MAC=$r_mac). Правильный мак: $mac1 или $mac2"| mail -s "Bad connections!!!" admin@ДОМЕН
        	echo "Пользователь $5 подключился с чужого компьютера IP=$r_ip (MAC=$r_mac). Правильный мак: $mac1 или $mac2" >> /usr/local/etc/mpd4/test
		echo "ipfw add 8$n fwd 192.168.0.100,90 tcp from $4 to any via vr0" >> /usr/local/etc/mpd4/test
		ipfw add 8$n fwd 192.168.0.100,90 tcp from $4 to any via vr0
fi

правила в фаерволе для пайпов создаются вида 5хх и 7хх (пока тока до 100 пользователей)
сами пайпы с 1-го
номер пайпа зависит от ИП выдаваемого пользователю.
Если юзер приконнектился с левым маком его перенаправляет на страничку с предупреждением и отправляется мыло админу.
Все действия ведутся в лог /usr/local/etc/mpd4/test (кому не нада мона ессесно убрать).

Далее
#cat down.sh

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

#!/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
#номер правила
i=`/bin/echo "select id from freeradius.radcheck where Username='$3';" |mysql -s -uЮЗЕР -pПАРОЛЬ`
#проверка для последней цифры в номере фаервола
if [ "$i" -le 9 ]
  then
        n=0$i
  else
        n=$i
fi
echo "-------------------------" >> /usr/local/etc/mpd4/test
echo `date` >> /usr/local/etc/mpd4/test
echo "Stop for user $3" >> /usr/local/etc/mpd4/test
echo "" >> /usr/local/etc/mpd4/test

echo "ipfw pipe delete $i" >> /usr/local/etc/mpd4/test
ipfw pipe delete $i
echo "ipfw pipe delete 1$n" >> /usr/local/etc/mpd4/test
ipfw pipe delete 1$n
echo "ipfw delete 5$n" >> /usr/local/etc/mpd4/test
ipfw delete 5$n
echo "ipfw delete 7$n" >> /usr/local/etc/mpd4/test
ipfw delete 7$n
echo "ipfw delete 8$n" >> /usr/local/etc/mpd4/test
ipfw delete 8$n

echo "" >> /usr/local/etc/mpd4/test
может канечна мона и попроще, но у мну пока так, главное работает ;)
ядерный взрыв...смертельно красиво...жаль, что не вечно...

100kg
ст. сержант
Сообщения: 393
Зарегистрирован: 2006-05-18 14:01:32

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

Непрочитанное сообщение 100kg » 2007-09-22 17:49:20

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

file="/tmp/file"
zamenity="`echo "$file" | sed -e "s/word/100kg/"`"
нужно заменить слово word на 100kg в фаиле /tmp/file, после запуска скрипта выводит только путь $file но замена не проиcходит! как правельно будет?

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

chword="100kg"
zamenity="sed -e "s/word/${chword}/""
а вот так все работает