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

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
RaDiST_1977
мл. сержант
Сообщения: 86
Зарегистрирован: 2006-10-31 12:04:36
Откуда: Зеленоград

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

Непрочитанное сообщение RaDiST_1977 » 2007-09-25 20:58:59

прстейший скрипт для синхронизации времени
timesync.sh

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

#!/bin/sh

ntd=" /usr/sbin/ntpdate "
timesrv=" ntp0.zenon.net " # впринципе здесь можно указать любой сервер ntp

$ntd -u -q $timesrv

echo "Time synchronized successfuly"

exit


Хостинговая компания 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/

Miha_hard
рядовой
Сообщения: 25
Зарегистрирован: 2007-05-13 9:00:05

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

Непрочитанное сообщение Miha_hard » 2007-09-30 11:10:23

RaDiST_1977 писал(а):прстейший скрипт для синхронизации времени

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

cat /etc/rc.conf|grep ntpdate
ntpdate_enable="YES"             # Run ntpdate to sync time on boot (or NO).
ntpdate_program="/usr/sbin/ntpdate"     # path to ntpdate, if you want a different one.
ntpdate_flags="-b"              # Flags to ntpdate (if enabled).
ntpdate_hosts="ntp0.zenon.net"                # Whitespace-separated list of ntpdate(8) servers.
и потом:

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

/etc/rc.d/ntpdate start

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

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

Непрочитанное сообщение Alex Keda » 2007-09-30 12:53:31

помню, в какой-то версии FreeBSD он стартовал до загрузки правил файрволла...
если по дефолту было deny - начинались проблемы
=========
вот поэтому я тоже не юзаю штатный :)
кроном - раз в 4 часа и всё.
Убей их всех! Бог потом рассортирует...

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

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

Непрочитанное сообщение Alex Keda » 2007-10-05 8:23:23

наверное, будет статья...
если донастрою - даже сегодня...
на случай если не будет - это скрипт чтоб делать зеркало кламава

// скрипт оставляю, тка как из-за него тут дискуссия - новая версия доступна в статье: http://www.lissyara.su/?id=1374

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

#!/bin/sh

# юзайте новую весию: http://www.lissyara.su/?id=1374

# даннынй скрипт парсит логи апача для заданного
# виртуалхоста, и ищет файлы, на которые апач дал
# 404 ответ. Т.к. на этот хост ходят тока филиальные
# сервера - за обновлениями, то это и будут файлы обновлений.
# тупо скачиваем их с одного из зеркал, и всё.

# переменные
home_dir="/shares/sites/clamav_mirror"
http_err_log="log/error.log"
http_root_dir="data"
clamav_mirror="database.clamav.net"
clamav_version_server="current.cvd.clamav.net"

# приложения
cat="/bin/cat"
grep="/usr/bin/grep"
awk="/usr/bin/awk"
sort="/usr/bin/sort"
uniq="/usr/bin/uniq"
fetch="/usr/bin/fetch"
host="/usr/bin/host"
tr="/usr/bin/tr"

# достаём имена файлов, что просили клиенты
${cat} ${home_dir}/${http_err_log} | ${grep} "File does not exist" \
        | ${awk} -F "${http_root_dir}/" '{print $2}' | ${sort}  \
        | ${uniq} |
{
while read file_name
do
        # топем в диру для обновлений
        cd ${home_dir}/${http_root_dir}
        # качаем обновление
        ${fetch} "http://${clamav_mirror}/${file_name}"
done
}

# очищаем лог апача
echo -n > ${home_dir}/${http_err_log}

# Новую версию кламав получает из DNS.
# выглядит это так:
# host -t txt current.cvd.clamav.net
# current.cvd.clamav.net descriptive text "0.91.2:44:4474:1191572941:1"
# значения полей, в общем-то понятны, но не все (нихрена не понял
# из исходников), те что понял - вот:
# 0.91.2 - текущая версия ClamAV
# 44 - версия main.cvd
# 4474 - версия daily.cvd
# 1191572941 - штамп веремни чтоли
# 1 -
# соответственно - парсим и достаём её - частота работы скрипта выше чем
# частота срабатываний freshclam - следовательно файл будет скачан
# заранее, и удасться избежать части 404 ошибок
# да и вообще - решение более красивое :)

# достаём TXT запись
txt_records="`${host} -t txt ${clamav_version_server} | \
                        ${tr} -d '"' | ${awk} '{print $4}'`"

# разбираем на известные поля
main_cvd_ver="`echo ${txt_records} | ${awk} -F ':' '{print $2}'`"
daily_cvd_ver="`echo ${txt_records} | ${awk} -F ':' '{print $3}'`"

# проверяем наличие соответтсвующих файлов
if ! test -f ${home_dir}/${http_root_dir}/daily-${daily_cvd_ver}.cdiff
then
        # качаем файл
        cd ${home_dir}/${http_root_dir}
        ${fetch} "http://${clamav_mirror}/daily-${daily_cvd_ver}.cdiff"
fi

if ! test -f ${home_dir}/${http_root_dir}/main-${main_cvd_ver}.cdiff
then
        cd ${home_dir}/${http_root_dir}
        ${fetch} "http://${clamav_mirror}/main-${main_cvd_ver}.cdiff"
fi

# Зеркалируем прочие файлы, что удалось вычислить (флаг -m у fetch)
cd ${home_dir}/${http_root_dir}
# daily.cvd
${fetch} -m "http://${clamav_mirror}/daily.cvd"
# main.cvd
${fetch} -m "http://${clamav_mirror}/main.cvd"

Убей их всех! Бог потом рассортирует...

онанистоус
проходил мимо

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

Непрочитанное сообщение онанистоус » 2007-10-05 9:45:14

Можно два тупых вопроса:
1) Че за тенденция пихать команды в переменные? Про alias'ы забыли?
2) Зачем писать полный путь до команды? PATH'а не хватает?

А то я не уловлю глубокого смысла в сем криптографическом коде.

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

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

Непрочитанное сообщение Andy » 2007-10-05 12:06:56

онанистоус писал(а):Можно два тупых вопроса:
1) Че за тенденция пихать команды в переменные? Про alias'ы забыли?
2) Зачем писать полный путь до команды? PATH'а не хватает?

А то я не уловлю глубокого смысла в сем криптографическом коде.
Ты с опеннета? или с ЛОР?
Писать полный путь до команды, надо для того, что бы тебя не подъебнули с
левым файлом носящим такое же название.
Jul 16 19:37:15 freebsd sshd[4152]: Invalid user idiot from 210.75.200.104

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

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

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

немного дополнил - теперь через DNS проверяет версии файлов и качает их заранее - с учтётом что скрпит работает достаточно часто (у меня раз в 10 минут)
===============
онанистоус писал(а):Можно два тупых вопроса:
1) Че за тенденция пихать команды в переменные? Про alias'ы забыли?
2) Зачем писать полный путь до команды? PATH'а не хватает?

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

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

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

Непрочитанное сообщение Andy » 2007-10-05 12:52:55

lissyara писал(а):могу добавить, что иногда в скриптах используемых между сильно разными версиями платформ я встраиваю проверку наличия бинарников в указанном месте и выход в случае их отстутсвия.
а то наработает, без каконить приложения :)
Можешь привести примеры онных?
Jul 16 19:37:15 freebsd sshd[4152]: Invalid user idiot from 210.75.200.104

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

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

Непрочитанное сообщение schizoid » 2007-10-05 12:58:55

наверна каждый пишет по-своему, как ЕМУ удобнее
я вот тоже только последнее время стал PATH использовать, чего раньше не юзал - хз. с ним МНЕ удобнее
ядерный взрыв...смертельно красиво...жаль, что не вечно...

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

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

Непрочитанное сообщение Alex Keda » 2007-10-05 13:26:19

Andy писал(а):
lissyara писал(а):могу добавить, что иногда в скриптах используемых между сильно разными версиями платформ я встраиваю проверку наличия бинарников в указанном месте и выход в случае их отстутсвия.
а то наработает, без каконить приложения :)
Можешь привести примеры онных?
http://www.lissyara.su/?id=1066
равно как и скрипты использующие не только системный софт - что-то стоящее из портов.
его может не быть на другой машине
Убей их всех! Бог потом рассортирует...

онанистоус
проходил мимо

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

Непрочитанное сообщение онанистоус » 2007-10-05 19:31:30

Andy писал(а): А то я не уловлю глубокого смысла в сем криптографическом коде.
Ты с опеннета? или с ЛОР?
Не угадал.
Andy писал(а): Писать полный путь до команды, надо для того, что бы тебя не подъебнули с
левым файлом носящим такое же название.
Такой умный? Почему же никто другой не додумался? Или хочешь сказать, что когда PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/home/pupkin/bin
...написав route, каким-то чудесным образом запустится не /sbin/route, а /home/pupkin/bin/route и украдет привилегии? Случаем не игнорируем порядок?

К тому же можно вначале скрипта прописать свой PATH, чтоб отсечь вредные совпадения. Или наш Вася Пупкин имеет доступ в /bin или /sbin? Но тогда вас не спасет прописывание полного пути.
lissyara писал(а): могу добавить, что иногда в скриптах используемых между сильно разными версиями платформ я встраиваю проверку наличия бинарников в указанном месте и выход в случае их отстутсвия.
а то наработает, без каконить приложения :)

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

# test existence
unset PATH
PATH=/bin:/sbin:/usr/bin:/usr/sbin # use only system binaries, no third parties
type >&- 2>&- cat grep awk sort uniq fetch || { echo blablabla; exit 1; }
а не...

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

sh=$(ls 2>&- /bin/sh) || { echo "sh(1) not found"; exit 1; }
sed=$(ls 2>&- /usr/bin/sed) || { echo "sed(1) not found"; exit 1; }

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

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

Непрочитанное сообщение Andy » 2007-10-06 12:51:53

онанистоус писал(а): Такой умный? Почему же никто другой не додумался? Или хочешь сказать, что когда PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/home/pupkin/bin
...написав route, каким-то чудесным образом запустится не /sbin/route, а /home/pupkin/bin/route и украдет привилегии? Случаем не игнорируем порядок?
А кто тебе сказал, что файл .cshrc в домашней директории пользователя присутствует? Может его удалили уже за ненадобностью, причем неважно кто?

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

Linux localhost.localdomain 2.6.18-std-smp-alt7 #1 SMP Sat Aug 4 00:07:54 MSD 2007 i686 GNU/Linux
По умолчанию, после того как пользователь создан в ALT Linux (не знаю как в других), dot файлы в пользоватльской директории отсутствуют.

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

[andy@localhost ~]$ pwd
/home/andy
[andy@localhost ~]$ ls -l
итого 161416
drwx------  2 andy andy      4096 Окт  5 12:12 Desktop
drwx------  2 andy andy      4096 Окт  4 20:15 Documents
-rw-r--r--  1 andy andy  61095350 Окт  5 20:45 Ja.r01
-rw-r--r--  1 andy andy 104000000 Окт  5 18:47 Ja.rar
-rwxr-xr-x  1 andy andy        30 Окт  5 13:21 man.sh
drwxr-xr-x 25 andy andy      4096 Окт  6 12:52 music
drwx------  2 andy andy      4096 Окт  3 17:52 tmp
[andy@localhost ~]$
Поглядим PATH пользователя по умолчанию.

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

[andy@localhost ~]$ echo $PATH
/home/andy/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin:/usr/games:/usr/X11R6/bin
[andy@localhost ~]$
Теперь попробуем вызвать утилиту ping

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

[andy@localhost ~]$ ping
Usage: ping [-LRUbdfnqrvVaA] [-c count] [-i interval] [-w deadline]
            [-p pattern] [-s packetsize] [-t ttl] [-I interface or address]
            [-M mtu discovery hint] [-S sndbuf]
            [ -T timestamp option ] [ -Q tos ] [hop1 ...] destination
[andy@localhost ~]$
Создадим в каталоге /usr/local/bin:/, файл ping следующего содержания:

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

#! /bin/sh
echo "hi!"
и сделаем его запускамым

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

chmod +x ping
вызовем утилиту пользователем

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

[andy@localhost ~]$ ping
hi!
[andy@localhost ~]$
Становиться ясно, что указав прямой путь, такой досадной накладки бы не случилось.Я конечно понимаю, что благодаря системе прав в nix-like системах, все вышеизложенное выглядит как попытка притянуть муде к бороде, однако ведь как то системы ломают? Прошу прощения, что на Линуксе, сейчас не могу во FreeBSD переключится. Однако как руки дойдут, попробую и там. И еще не надо орать, что мол Линукс г и вообще у них там все неправильно. Прошу понять одно, жизнь не только FreeBSD, а еще и Linux, Solaris, AIX и прочие блага цивилизации, отсюда - написание скриптов именно на /bin/sh, ибо есть такое понятие как POSIX. Уместно вспомнить коллегу Лиса, который офигел когда ему пришлось переписывать скрипты на /bin/sh.
Если несколько строк кода способны однозначно гарантировать результат, по крайней мере с вероятностью 99 процентов, то не вижу причин их не написать. Все вышесказанное, является к иллюстрацией к мыслеизложению, и ни в коем случае не преследует попытки провокации флейма. За этим в ЛОР и opennet. Спасибо за мысли и код.
Jul 16 19:37:15 freebsd sshd[4152]: Invalid user idiot from 210.75.200.104

онанистоус
проходил мимо

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

Непрочитанное сообщение онанистоус » 2007-10-07 0:02:25

Andy писал(а): А кто тебе сказал, что файл .cshrc в домашней директории пользователя присутствует? Может его удалили уже за ненадобностью, причем неважно кто?
Скрипты запускаешь от csh(1)? К тому же я юзаю /etc/csh.cshrc
Andy писал(а): Поглядим PATH пользователя по умолчанию.

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

[andy@localhost ~]$ echo $PATH
/home/andy/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin:/usr/games:/usr/X11R6/bin
У-у-у, как все печально!
Andy писал(а): Создадим в каталоге /usr/local/bin:/, файл ping следующего содержания:
Это с каких пор обычный юзверь имеет доступ на запись в /usr/local/bin? А знаешь, если, например, юзер будет иметь доступ на запись и исполнение хотябы к одному suid-файлу, то система компромитирована.
Прикол в том, что если я имею доступ на запись в системную диру, то я могу просто заменить любой файл своим и никакой полный путь до команды в скрипте тя не спасет. Если не хуже.
Andy писал(а): написание скриптов именно на /bin/sh, ибо есть такое понятие как POSIX. Уместно вспомнить коллегу Лиса, который офигел когда ему пришлось переписывать скрипты на /bin/sh.
Хм, а в POSIX разве входит nawk (в фре просто awk), sed, grep, jot, wget (во фре fetch), route, ifconfig и прочие прелести? По-моему только sh(1), test(1) и expr(1). Хотя хз, POSIX'ов много и все с разными номерами, т.к. bash вроде тоже POSIX.
Andy писал(а): Прошу прощения, что на Линуксе, сейчас не могу во FreeBSD переключится. Однако как руки дойдут, попробую и там.
На -current у новосозданного с абсолютно пустой дирой PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/home/test/bin
И корни сего в /etc/login.conf
Andy писал(а): И еще не надо орать, что мол Линукс г и вообще у них там все неправильно
А причем тут весь линь? По вашему посту ясно у кого именно растут не понятно откуда и где надо принудительно выставлять свой PATH.
Andy писал(а): Если несколько строк кода способны однозначно гарантировать результат, по крайней мере с вероятностью 99 процентов, то не вижу причин их не написать.
Смысл в моих постах, что вот эта фраза - бред. Гарантировать результат можно только после тестов и то на ~50%.

ps: вам тоже thx за дискуссию

онанистоус
проходил мимо

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

Непрочитанное сообщение онанистоус » 2007-10-07 0:26:04

да и я смотрю тут игнориют то, что некоторые утилиты могут быть в совершенно разных папках на разных системах. Вот тогда ваш полный путь до команды точно накроется. :)

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

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

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

онанистоус писал(а):да и я смотрю тут игнориют то, что некоторые утилиты могут быть в совершенно разных папках на разных системах. Вот тогда ваш полный путь до команды точно накроется. :)

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

# Проверяем наличие приложений - в разных версиях FreeBSD разные пути
for application in ${cat} ${awk} ${echo} ${grep} ${pw} ${rm} ${mkdir} \
${chown} ${php} ${cp} ${mysql} ${wc} ${cut} ${md5} ${jot} ${tail} \
${edquota} ${ls} ${chflags} ${tr} ${mysqldump} ${gzip} ${rm} ${mv} \
${basename} ${uname} ${php_ini}
do
	if [ ! -s ${application} ]; then 
		echo "Приложение \`\`${application}'' не найдено! Проверьте путь!"
		exit
	fi
done
1. взрослейте. с таким ником серьёзно никто никогда не воспримет - тока за тролля примут.
2. помоему я уже написал почму - я хочу быть уверенным что запуститсья именно то приложение, путь к которму у меня прописан в переемнной.
корни сего стары - но я считаю что так лучше.
да и удобней, как показало время.
==============
за сим дискуссию предлагаю закрыть, если все согласны (что будет ясно по отсутствию/наличию дальнейших постов), то через пару дней перенесу это интересное обсуждение в отдельную тему.
Убей их всех! Бог потом рассортирует...

kmb
лейтенант
Сообщения: 680
Зарегистрирован: 2007-02-20 8:30:03
Контактная информация:

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

Непрочитанное сообщение kmb » 2007-10-20 12:46:37

Немного переделанный скрипт для анализа логов ipacctd.
Использование:
./ipacctd_stat.sh path_to_logfile
Либо можно за промежуток времени:
./ipacctd_stat.sh path_to_logfile DD/MM/YYYY(откуда начинать считать) DD/MM/YYYY(докуда считать)

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

#!/bin/sh

external_IP="`/sbin/ifconfig iwi0 | grep inet | awk '{print $2}'`"
tmp_file="/tmp/ipacctd.traffic.$$.tmp"
logfile=$1

if [ $# -eq 1 ]
then
    stime="`cat $logfile | sort -gk8 | head -1 | awk '{print $8}'`"
    etime="`cat $logfile | sort -gk8 | tail -1 | awk '{print $8}'`"
    stime="`date -r $stime`"
    etime="`date -r $etime`"
        cat $logfile | grep "^[0-9]" | grep -v "^$external_IP"| awk '
            BEGIN { ib=0 }
                    {
                       ib=$6+ib
                    }
            END {
                printf "%s \n",ib
            } ' > ${tmp_file}
            read bytes_in < ${tmp_file}
        cat $logfile | grep "^[0-9]" | grep "^$external_IP"| awk '
            BEGIN { ob=0 }
                    {
                       ob=$6+ob
                    }
            END {
                printf "%s \n",ob
            } ' > ${tmp_file}
            read bytes_out < ${tmp_file}
            rm ${tmp_file}
echo "$stime "-" $etime
IP:      $external_IP
IN:      `expr ${bytes_in} / 1048576` Mb
OUT:     `expr ${bytes_out} / 1048576` Mb"          
#echo ${bytes_in} ${bytes_out}
elif [ $# -eq 0 ]
then
    echo "Please, select path to logfile."
else
stime=`date -j -f "%d/%m/%Y %H:%M:%S" "$2 00:00:00" "+%s"`
etime=`date -j -f "%d/%m/%Y %H:%M:%S" "$3 23:59:59" "+%s"`
#echo $stime $etime
        cat $logfile | grep "^[0-9]" | grep -v "^$external_IP" | awk '
            BEGIN { ib=0 }
                    {
                    if($8>='$stime' && $8<='$etime')
                       ib=$6+ib
                    }
            END {
                printf "%s \n",ib
            }
             ' > ${tmp_file}
            read bytes_in < ${tmp_file}    
        cat $logfile | grep "^[0-9]" | grep "^$external_IP" | awk '
            BEGIN { ob=0 }
                    {
                    if($8>='$stime' && $8<='$etime')
                       ob=$6+ob
                    }
            END {
                printf "%s \n",ob
            } ' > ${tmp_file}
            read bytes_out < ${tmp_file}
            rm ${tmp_file}
stime="`date -r $stime`"
etime="`date -r $etime`"
echo "$stime "-" $etime
IP:      $external_IP
IN:      `expr ${bytes_in} / 1048576` Mb
OUT:     `expr ${bytes_out} / 1048576` Mb"          
#echo ${bytes_in} ${bytes_out}
fi
exit 0
truth is out there...

Dr_Phoenix
проходил мимо

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

Непрочитанное сообщение Dr_Phoenix » 2007-10-31 17:25:40

Вот простенький скрипт который считывает из файла названия пакетов, скачивает их и все пакеты которые от их зависят, использует wget для закачек, если wget не стоит то скрипт автоматом поставит его.
Формат файла() с названиями пакетов очень простой:
:kde-3.5.7.tbz
:package_name.tbz


!В процесе работы скрипт создаст Лог-файл в котором можно посмотреть чего и сколько тянулось... :D

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

#!/bin/sh

#--------------- Packages fetch script ----------------
#              Created by Dr_Phoenix 2007
# ===================================================
# My script can recursively fetch all dependent
# packages for each package defined in list file.
# All process history you can view in log file.
#------------------------------------------------------
cur_dir=`pwd`
mastersite="ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/i386/packages-7-current/All/" # Полный путь на ФТП сервер где лежат все пакеты
pkg_list_file="${cur_dir}/pkg_list" # Файл в котором перечислено то что надо закачать 
dist_folder="${cur_dir}/packages" # Папка куда будут ложится пакеты
logfile="${cur_dir}/pk_get.log" # путь к лог-файлу(в даном случае в текущей директории)
part_downloaded_noskip=1 # 1-не пропускать недокачаные файлы 0-пропускать


clear
start_date=`date "+ %y-%m-%d %H:%M"`
machine=`hostname`
echo "Started on ${machine} at: $start_date"  >> ${logfile}
wget_installed=`pkg_info | grep -c wget`

if [ -d ${dist_folder} ]; then
 echo "Dist folder present! OK."
  else
   mkdir ${dist_folder}
   echo "Dist folder created."
fi


if [ ${wget_installed} -eq 0  ]; then
echo "Wget not found. Trying to install it..."
cd /usr/ports/ftp/wget
make install clean
cd ${cur_dir}
fi


download_full_dep()
{
cd ${dist_folder}
wget -c ${mastersite}${pkg_name}
echo "--> PKG [OK] $pkg_name" >> $logfile
list_num=`pkg_info -r ${pkg_name} | grep -c Dependency`
list_to_fetch=`pkg_info -r ${pkg_name} | grep Dependency | cut -f 2 -d ":"`
echo "Needed ${list_num} depend files to ${pkg_name}"
echo "--> Needed ${list_num} depend files to ${pkg_name}" >> $logfile
count=1
while  [ $count -le $list_num ]; do
pkg_cur_dist=`echo $list_to_fetch | cut -f $count -d " "`
echo "--> Downloading depend $pkg_cur_dist ..."
if [ -f "./${pkg_cur_dist}.tbz" ]; then
 echo "Already downloaded..."
 echo "Already downloaded $pkg_cur_dist.tbz" >> $logfile
    if [ $part_downloaded_noskip ]; then
        wget -c "${mastersite}${pkg_cur_dist}.tbz"
    fi
  else wget -c "${mastersite}${pkg_cur_dist}.tbz"
       echo Done.
       echo "Depend [OK]  $pkg_cur_dist.tbz" >> $logfile

fi

count=`expr $count + 1`
done

}

#------- read & parse input file
if [ -f "$pkg_list_file" ]; then
files_list=`cat "$pkg_list_file"`
num_files=`cat $pkg_list_file | grep -c :`
 echo "--> $num_files files in quie! "
 echo "--> $num_files files in quie!" >> $logfile
 countf=1

 while [ $countf -le $num_files ]; do
  f_position=`expr $countf + 1`
  pkg_name=`echo $files_list | cut -f $f_position -d ":"`
  download_full_dep

  countf=`expr $countf + 1`
 done

  else touch $pkg_list_file
      echo "Error! No files specified. Add filenames to $pkg_list_file"
      echo "Format of each line is ':package_name.tbz' "
      echo "                        :package_next.tbz"
fi

stop_date=`date "+ %y-%m-%d %H:%M"`
echo "All packages fetched on $machine at $stop_date" >> $logfile

AciD
проходил мимо
Сообщения: 2
Зарегистрирован: 2007-12-11 13:08:53

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

Непрочитанное сообщение AciD » 2007-12-11 13:27:21

Скрипт динамического шейпера. Пингует все компьютеры указанные в файле и на основании этого режет скорость каждому. Не пинайте сильно - это мой первый скрипт. Запускать можно по крону.

shaper.sh

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

#!/bin/sh
# Ввести лог 1-да/0-нет
log=0
# Юзеров в базе
online=4
# Ширина канала в интернет
bw=600000
# Файл лога
log_file="shaper.log"
# время
date_time="`date +%H:%M:%S`"
# дата
date="`date +%d-%m-%Y`"
date="`date | awk '{print $1,$2,$3,$4,$5}'`"

ips=$(jot $online)

for i in $ips
do
ip=$(cat users | sed -n ''$i'p' | awk '{print$2}')
test=$(ping -q -o -c 2 $ip | grep "packet loss" | awk '{print $4}')
if [ $test = 0 ]
    then
         online=$(expr $online - 1)
    fi
done
if [ $online -gt 0 ]
    then
    bw=$(expr $bw / $online)
  for p in $ips
   do
  pipe=$(cat users | sed -n ''$p'p' | awk '{print$3}')
  ipfw pipe $pipe config bw $bw queue 10
   done
fi

if [ $log = 1 ]
then
echo "-------------------------------
Дата:  $date
Время: $date_time
Лимит на одного пользователя: $bw Kbit/s
Пользователей онлайн : $online
-------------------------------" >> $log_file
fi

Файл базы пользователей. Формат файла : [Номер по базе][IP-Компьютера][Номер Pipe в IPFW для коректировки скорости для данного IP]

users

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

1 192.168.0.1  1
2 192.168.0.2  2
3 192.168.0.3  3
4 192.168.0.4  4
В данный момент учю PHP , хочу написать Веб-Морду с подобным предназначением...

Гость
проходил мимо

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

Непрочитанное сообщение Гость » 2007-12-16 6:14:05

Прогноз погоды. Для Москвы:

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

> gismeteo
----
Ночь 16 дек, Вс:
пасмурно
без осадков
температура -3..-5 С
давление 754..756 мм рт.ст.
ветер Северо-Западный
4 м/с
----
Утро 16 дек, Вс:
облачно
небольшой снег
температура -1..-3 С
давление 754..756 мм рт.ст.
ветер Северный
4 м/с
----
День 16 дек, Вс:
облачно
небольшой снег
температура 0..-2 С
давление 755..757 мм рт.ст.
ветер Северный
4 м/с
----
Вечер 16 дек, Вс:
облачно
без осадков
температура -1..-3 С
давление 757..759 мм рт.ст.
ветер Северный
4 м/с
Для других городов (пример для Ташкента):

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

> gismeteo 38457
----
Ночь 16 дек, Вс:
облачно
без осадков
температура +1..+3 С
давление 720..722 мм рт.ст.
ветер Юго-Восточный
3 м/с
----
Утро 16 дек, Вс:
малооблачно
без осадков
температура +7..+9 С
давление 720..722 мм рт.ст.
ветер Юго-Восточный
4 м/с
----
День 16 дек, Вс:
пасмурно
без осадков
температура +5..+7 С
давление 720..722 мм рт.ст.
ветер Юго-Восточный
3 м/с
----
Вечер 16 дек, Вс:
пасмурно
без осадков
температура +4..+6 С
давление 721..723 мм рт.ст.
ветер Юго-Восточный
2 м/с

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

#! /bin/sh

id=${1:-27612}

fetch -qao - http://informer.gismeteo.ru/rss/$id.xml \
	| iconv -f cp1251 \
	| sed '#n
/item/,// {
	/.*<\(title\)>.*:[[:space:]]*\(.*\)<\/\1>.*/ {
		i\
		[1;31m----[22;39m
		s//\2:/
		:x
		s/[-[:digit:]]/[1;32m&[22;39m/g
		p
	}
	/.*<\(description\)>\(.*\)<\/\1>.*/ {
		s//\2/
		s/\, /,/g
		y/,/\n/
		bx
	}
}'
С цветами в коде поосторожней, а то некоторые браузеры их вырезают как и многие другие спецсимволы.

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

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

Непрочитанное сообщение Alex Keda » 2007-12-16 9:55:29

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

Аватара пользователя
serge
майор
Сообщения: 2132
Зарегистрирован: 2006-07-30 15:34:14
Откуда: Саратов
Контактная информация:

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

Непрочитанное сообщение serge » 2008-01-04 13:54:22

Статистика Exim через periodic.conf. За идею был взял скрипт лиса, но существенно переработан.

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

# vi /usr/local/etc/exim/configure
...
log_file_path = syslog : /var/log/exim/%s-%D.log	
...

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

# vi /etc/periodic.conf
...
# 465.exim-mail-statistic
daily_exim_mail_statistic_enable="YES"
...

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

# cat > /usr/local/etc/periodic/daily/465.exim-mail-statistic
if [ -r /etc/defaults/periodic.conf ]
then
    . /etc/defaults/periodic.conf
    source_periodic_confs
fi
LOG="/var/log/exim"
main_log="${LOG}/main-"`date -v-1d "+%Y%m%d"`.log
reject_log="${LOG}/reject-"`date -v-1d "+%Y%m%d"`.log
case "$daily_exim_mail_statistic_enable" in
    [Yy][Ee][Ss])
        echo ""
		echo "**************** EXIM statistic started **********************"
		n=$([ -f $main_log ] && /usr/local/sbin/eximstats -ne $main_log | tee /dev/stderr | wc -l)
		[ -f $main_log ] && rm $main_log
		[ -f $reject_log ] && rm $reject_log
		echo "**************** EXIM statistic ended ************************"
		[ $n -gt 0 ] && rc=1 || rc=0;;
    *)  rc=0;;
esac

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

# chmod +x /usr/local/etc/periodic/daily/465.exim-mail-statistic

Аватара пользователя
zoofield
мл. сержант
Сообщения: 121
Зарегистрирован: 2007-09-05 10:51:33
Откуда: 2:5071
Контактная информация:

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

Непрочитанное сообщение zoofield » 2008-01-11 7:22:12

Делал подсчет статистики через ipacctd, по аналогии как на этом сайте. Но в сетке работает ДХЦП, а хочется видеть имена компов.
Работает уже три месяца. вроде не глючит. Хотя мона кое-чё доаботать.
Смысл скрипта - обработать сбрасываемый ipacctd текстовый файл, заменив ИП на имена компов.

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

#!/bin/sh

# process file by sed: resolve IPs to names

pip=`netstat -rn |grep default|awk '{print $2}'`
#dip=`ifconfig | grep $pip | awk '{print $2}'`
#res="s/$dip/gate/g;s/10.0.0.1/gate/g;"
res="s/10.0.0.1/gate/g;"

fleas="/var/db/dhcpd/dhcpd.leases"
fhost="/etc/hosts"

ip=""

cat $fleas |
{
    # get from dhcp lease file
    while read p1 p2 p3 p4
    do
        # get next lease IP
        if [ "$p1" = "lease" ]; then
            ip=$p2
        fi
        # check for free...
        if [ "$ip" != "" -a "$p1" = "binding" -a "$p2" = "state" -a "$p3" = "free" ]; then
          #-o "$ip" != "" -a "$p1" = "ends" -a ]; then
             ip=""
        fi
        if [ "$p1" = "client-hostname" -a "$ip" != "" ]; then
            nam=`echo $p2 | awk -F'"' '{print $2}'`
            res="${res}s/${ip}/${nam}/g;"
            ip=""
        fi
    done

    # gethost names from hosts file
    cat $fhost |
    {
        while read p1 p2 p3 p4 p5 p6 p7 p8 p9
        do
            if [ "$p1" != "" ]; then
               res="${res}s/${p1}/${p2}/g;"
            fi
        done
    echo $res
    sed -e "$res" /var/log/IP_ACC > /var/log/IP_ACC_RES
    }
}
* Origin: ()

gabii
проходил мимо
Сообщения: 2
Зарегистрирован: 2007-10-19 22:44:52

Re:

Непрочитанное сообщение gabii » 2008-01-15 10:34:56

proxy-man писал(а):заменил свою "самоделку" предназначенную для бана хостов, которые под левыми юзреми ломятся на ssh :D - выглядит теперь так:

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

#!/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"
WC="/usr/bin/wc"
LOG="/usr/SHELL/auth.log"
FIREWALL="/etc/rc.firewall"
FDENY="/usr/SHELL/deny_hosts"
IPFW="/sbin/ipfw"
##############################################
# 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 name in ${ARR}; do
	# if IP exists into the file - stop procedure
	COUNT=`${CAT} ${FDENY}|${AWK} "/${name}$/"|${WC} -l`
                 if [ ${COUNT} -ge "1" ]; then
			continue
		else
                        # if IP doesn't exist - put it into the file
                	echo $name >> ${FDENY}
		fi
        done
}
############################################################
# check if a file exists for deny hosts and start function #

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

${IPFW} -f flush && /bin/sh < /etc/rc.firewall &

Хотя моя мысль, что такие вещи лучше писать на perl-е ибо у последнего больше вариантов при работе с регулярными выражениями ))
возникли след. вопросы
1. с какой переодичностью, оптимально, запускать скрипт?
2. в файрволе куда лучше поставить функцию host_deny(), после setup_loopback () или же в самом разделе [Cc][Oo][Mm][Pp][Aa][Nn][Yy]
3. Куда поставить правило ${fwcmd} add deny all from ${hosts} to me

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

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

Непрочитанное сообщение Alex Keda » 2008-01-27 23:25:48

из сегодняшних развлечений...
подсчёт траффика пача по виртуалхостам

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

hosting# cat apache.traff.sh
#!/bin/sh

# traffic file
traff_file="/var/log/httpd/traffic.log"
# MySQL
mysql_user="hosting_traffic"
mysql_pass="hosting_traffic"
mysql_db="hosting_traffic"
mysql_bin="/usr/local/bin/mysql"
# tmp file
tmp_file="/tmp/traffic.log"

# mysql connect data
mysql_conn="${mysql_bin} --user=${mysql_user} --password=${mysql_pass} --database=${mysql_db}"
# year
year="`date -v-1d +%Y`"
old_date="`date -v-1d +%Y-%m-%d`"

# flush temporary table
${mysql_conn} --execute="TRUNCATE TABLE \`tmp_traffic_table\`"

# move file statistic
/bin/cat ${traff_file} > ${tmp_file}
echo -n > ${traff_file}

# loading data from file into temporary table
${mysql_conn} --execute="LOAD DATA INFILE '${tmp_file}' INTO TABLE \`tmp_traffic_table\` FIELDS TERMINATED BY ' ' LINES TERMINATED BY '\n'"

# create table, if not exists
${mysql_conn} --execute="CREATE TABLE IF NOT EXISTS \`http_traff_${year}\` (    \
                        \`uniq_id\` int(6) NOT NULL auto_increment,             \
                        \`curr_date\` date NOT NULL,                            \
                        \`vhost\` varchar(127) NOT NULL,                        \
                        \`input\` int(12) NOT NULL,                             \
                        \`output\` int(12) NOT NULL,                            \
                        PRIMARY KEY  (\`uniq_id\`),                             \
                        UNIQUE KEY \`date_vhost\` (\`curr_date\`,\`vhost\`),    \
                        KEY \`curr_date\` (\`curr_date\`)                       \
                        ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;"

${mysql_conn} --execute="INSERT INTO \`http_traff_${year}\`                     \
                        (\`curr_date\`, \`vhost\`, \`input\`, \`output\`)       \
                        SELECT '${old_date}', \`vhost\`, SUM(\`input\`), SUM(\`output\`)\
                        FROM \`tmp_traffic_table\` GROUP BY \`vhost\`"
лог получается таким образом:
в главной секции

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

LogFormat       "%v %I %O"      traffic
и в каждом вхосте (или в общей - смотря как логгинг сделан)

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

CustomLog      /var/log/httpd/traffic.log traffic
временная таблица - тупо три поля, юзер hosting_traffic должен обладать глобальной привилегией FILE
запус скрипта - в ровно, ночью... у меня правда стоит в 0:01 =)
Убей их всех! Бог потом рассортирует...

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

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

Непрочитанное сообщение Alex Keda » 2008-01-28 12:16:22

serge писал(а):Вот бы еще для использования памяти и проца по пользователям... :wink: :P
время будет - напишу.
ещё шаблон надо для апача - виртуалхосты заводить...
Убей их всех! Бог потом рассортирует...