bash-скрипты
Daevy 4 сентября, 2008 - 14:40
Народ, тут тема где парню надо было узнать место на винте сподвигла на идею! Давайте выкладывать свои полезные скриптики у кого какие есть. Чтоб добро не пропадало, чтоб люди их могли улучшать и юзать! Да здравствует GNU/GPL! %)
Начну первый
Скрипт выполняет открыт ли порт какой либо сетевой службы и при случае если он свалился перезапускает ответственную за него службу.
#!/bin/bash
RES="/tmp/result"
HOST="localhost"
SERVICE="sendmail"
PORT="25"
telnet $HOST $PORT &> $RES & #1
sleep 5 #2
if cat $RES |grep Unable; then /etc/init.d/$SERVICE restart #3
else echo "OK"; rm $RES; exit; #4
fi
#1 - проверяем телнетом, результат пишем во временный файл и уходим в фон
#2 - ждем 5 сек, перед тем как почесть файл (ответ от телнета уже должен записаться)
#3 - парсим файл по значению Unable, если удачно, то перезапускаем сервис
#4 - если Unable нету, то удаляем временный файл и выходим
#после выхода из скрипта фоновый процесс телнета завершается будучи дочерним от процесса скрипта
* после рестарта службы можно добавить отсылку письма или запись в лог.
»
- Для комментирования войдите или зарегистрируйтесь

Оптимизация
s/'cat $RES |grep Unable'/'grep Unable $RES'
Я бы делал
Я бы делал через netstat.
+
выбрал телнет потому что были случаи с индейцем, что netstat показывает что порт открыт, а на самом деле сокет мертв(((
Вот мой
Вот мой вариант
# cat watchdog
#!/bin/bash
nmap -p $2 localhost |grep open
if [ `echo $?` = 1 ]
then
/etc/init.d/$1 restart
fi
10:10:19 Astarte kos # time sh watchdog postfix 25
postfix restart
real 0m0.047s
user 0m0.041s
sys 0m0.006s
10:10:40 Astarte kos # time sh watchdog1
telnet: Unable to connect to remote host: Address family not supported by protocol
/etc/init.d/sendmail restart
real 0m5.007s
user 0m0.004s
sys 0m0.005s
Работоспособность службы не
Работоспособность службы не ограничивается наличием открытого порта. Что нить поизощренней типа wget, с последующим разбором результата. Плюс оповещалку, плюс сохранение инцитдента в какой нить базе. Заббикс можно научить.
Хорошая
Хорошая тема.
Извиняюсь за оффтоп, но нет ли у кого случайно скрипта который выводит список пакетов от которых никакие другие пакеты не зависят?
Или может есть какое-то готовое средство? Просто иногда попробуешь какую-нибудь программу, потом удалишь, а то что она за собой утянула остается и болтается в системе без всякой надобности. Перебирать каждый интересующий пакет руками через equery d не очень то хочется.
revdep-rebuild, не?
revdep-rebuild, не?
Нее, emerge --depclean -a
Нее, emerge --depclean -a
Да он только
Да он только всё грозиться удалить "важные пакеты", но на самом деле практически ничего и не удаляет)
А revdep-rebuild вообще в моей практике ничего ни разу не удалял, только пересобирал.
Попробую что-нибудь придумать
Он как раз
Он как раз делает то, что вы и просили. Удаляет зависимости пакета. Если делать вот так:
emerge --depclean
revdep-rebuild
emerge -uDNv world
То почистите систему и ничего не просрется [-:
:)
Самое весёлое, что приведённая последовательность команд полнотой не отличается :)
--
Live free or die
DreamDragon
vim /var/lib/portage/worldесли ты все ставил правильно, то получишь список пакетов, от которых никто не зависит ))остальные пакеты удаляются по
emerge --depclean;)не совсем
Не совсем. Легко может быть ситуация, при которой тебе нужен какой-то пакет и его зависимость. Соответственно, и пакет и зависимость будут в world (например, с perl-либами такое у меня бывает)
еще один скриптос :-)
тут не совсем bash скрипт, суть в следующем, скрипт проверяет есть ли впн-каналы до удаленных точек, если нет то проверяет доступность точки, если точка доступна то пытается перезапустить канал. если вовсе недоступна то выводит сообщение
!/sbin/runscript opts="${opts} start test up reload" test() { ebegin "Starting remote net test" if ping -c 3 172.17.1.1 &> /dev/null then echo "filial01 - SAVELYEVA net - OK" else if ping -c 3 192.168.223.33 &> /dev/null then echo "SAVELYEVA vpn tunnel down"; ipsec auto --up filial01 else echo "filial01 - SAVELYEVA net not responds" fi fi if ping -c 3 172.17.2.1 &> /dev/null then echo "filial02 - DANILOVSKY net - OK" else if ping -c 3 192.168.2.34 &> /dev/null then echo "DANILOVSKY vpn tunnel down"; ipsec auto --up filial02 else echo "filial02 - DANILOVSKY net not responds" fi fi einfo "All net tests done." } up() { echo "available names: filial01, filial02" echo "Enter net name" read "NET" ipsec auto --up $NET } reload() { ebegin "Reload IPSec subsystem" /etc/init.d/ipsec stop; /etc/init.d/ipsec start } start() { ebegin "Restart and post-test remote units system" reload test }вобще в оригинальном скрипте около 20 филиалов и для каждого свой блок кода, так вот задачка для ума, можно оптимизировать скрипт через цикл, чтобы шел перебор доступных филиалов, дабы не прописывать каждый филиал отдельно
ps. забыл упомянуть в качестве впн-сервиса используется strongswan, синтаксис конфигов практически одинаков с freeswan/openswan
ну под такую
ну под такую радость вообще нужно выделять блог и мал по мал собирать разные полезности. эх, если б кто взялся
# cat
# cat /etc/init.d/myshaper
#!/sbin/runscript
IFACE="eth1"
start() {
ebegin "Shaper Starting..."
# определение переменных
DPORT="match ip dport"
SPORT="match ip sport"
U32="protocol ip u32"
ICMP="match ip protocol 1 0xff"
TCP="match ip protocol 6 0xff"
UDP="match ip protocol 17 0xff"
RATE_OUT="700" # скорость исходящего трафика
tc qdisc add dev $IFACE root handle 1: htb default 13
tc class add dev $IFACE parent 1: classid 1:1 htb rate ${RATE_OUT}kbit
#делим канал на 4 части
tc class add dev $IFACE parent 1:1 classid 1:10 htb rate $[$RATE_OUT/9]kbit ceil $[$RATE_OUT/2]kbit prio 0
tc class add dev $IFACE parent 1:1 classid 1:11 htb rate 20kbit prio 1
tc class add dev $IFACE parent 1:1 classid 1:12 htb rate $[$RATE_OUT/2]kbit ceil ${RATE_OUT}kbit prio 2
tc class add dev $IFACE parent 1:1 classid 1:13 htb rate $[$RATE_OUT/9]kbit ceil ${RATE_OUT}kbit prio 3
# $SPORT 22 0xffff - 22 port, 22 0xfffe - 22,23 ports.
# 1:10
tc filter add dev $IFACE parent 1:0 prio 1 $U32 $TCP $SPORT 22 0xffff classid 1:10
tc filter add dev $IFACE parent 1:0 prio 1 $U32 $TCP $DPORT 22 0xffff classid 1:10
# 1:11
tc filter add dev $IFACE parent 1:0 prio 1 $U32 $ICMP classid 1:11
# 1:12
tc filter add dev $IFACE parent 1:0 prio 2 $U32 $TCP $DPORT 80 0xffff classid 1:12
tc filter add dev $IFACE parent 1:0 prio 2 $U32 $TCP $DPORT 443 0xffff classid 1:12
tc filter add dev $IFACE parent 1:0 prio 2 $U32 $TCP $SPORT 25 0xffff classid 1:12
tc filter add dev $IFACE parent 1:0 prio 2 $U32 $TCP $SPORT 80 0xffff classid 1:12
tc filter add dev $IFACE parent 1:0 prio 2 $U32 $TCP $SPORT 443 0xffff classid 1:12
#остальное в 1:13
# алгоритм добавления очереди
tc qdisc add dev $IFACE parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev $IFACE parent 1:11 handle 11: sfq perturb 10
tc qdisc add dev $IFACE parent 1:12 handle 12: sfq perturb 10
tc qdisc add dev $IFACE parent 1:13 handle 13: sfq perturb 10
eend $?
}
stop() {
ebegin "Shaper Stopping..."
IFACE=eth1
tc qdisc del dev $IFACE root
eend $?
}
субдомены && apache
вот писал: http://www.gentoo.ru/node/11842
не удивлен, но ни кто мне не ответил и не помог. это часто свойственно людям, но помог себе сам :)
через mod_rewrite, эффект получил совершенно не тот :(
но написал скрипт за вечер :)
#!/bin/bash
# Not optimized!!! [FixMe]
# Crash don't detected
APACHE2_STATUS="/etc/init.d/apache2 status";
APACHE2_START="/etc/init.d/apache2 start";
APACHE2_STOP="/etc/init.d/apache2 stop";
$APACHE2_STATUS
if [ $? = 0 ]; then
$APACHE2_STOP >/dev/null 2>&1
fi
VHOST_DIR="/home/www/localhost/vhosts/works";
VHOSTS_BASE="/usr/local/etc/vhost.conf";
HOSTS_CONF_FILE="/etc/hosts"
VHOST_CONF_FILE="/etc/apache2/vhosts.d/works_vhost.include";
VHOST_COUNT=`ls -t $VHOST_DIR|awk -F' ' '{ print $0 | "sort" }'|wc -l`
while [ $VHOST_COUNT -gt 0 ]
do
VHOST=`ls -t $VHOST_DIR|awk -F' ' '{ print $0 | "sort" }'|head -n $VHOST_COUNT|tail -n 1`
let VHOST_COUNT=VHOST_COUNT-1
grep -x $VHOST $VHOSTS_BASE >/dev/null 2>&1
if [ $? = 0 ]; then
echo -en "\033[32;40;5m * \033[0m$VHOST:\033[32;40;22m exist \033[0m\n"
else
echo -en "\033[32;40;5m * \033[0m$VHOST:\033[31;40;22m don't exist \033[0m "
VHOST_CONF="\n<VirtualHost localhost:80>\n\tServerName $VHOST\n\tServerAdmin root@localhost\n\tDocumentRoot \"/home/www/localhost/vhosts/works/$VHOST\"\n\n\t<Directory \"/home/www/localhost/vhosts/works/$VHOST\">\n\t\tOptions Indexes FollowSymLinks\n\t\tAllowOverride All\n\t\tOrder allow,deny\n\t\tAllow from all\n\t</Directory>\n\n\t<IfModule mpm_peruser_module>\n\t\tServerEnvironment apache apache\n\t</IfModule>\n</VirtualHost>\n";
echo -en $VHOST_CONF >> $VHOST_CONF_FILE
echo $VHOST >> $VHOSTS_BASE
echo -en "192.168.0.1\t$VHOST\n" >> $HOSTS_CONF_FILE
echo -en "\033[32;40;22m (add) \033[0m\n"
fi
done
$APACHE2_STATUS
if [ $? != 0 ]; then
$APACHE2_START >/dev/null 2>&1
fi
маленький такой скриптик, дает нужную функциональность. есть парочка не доработок :( как видно читаются не только директории, нет функции удаления отутсвующих в реальности но имеющихся в базе хостов, да и все вроде :)
#!/bin/bash
DATE=`/bin/date "+%Y%m%d"`
PORTDIR="/usr/portage/"
FILENAME="portage"
SAVEDIR="/home/ftp/gentoo/portage/"
OPTIONS="Create Erase Check Quit"
echo -e '\E[37;44m'"\033[1mToday : `/bin/date "+%c"`\033[0m"; tput sgr0
select opt in $OPTIONS; do
if [ "$opt" = "Create" ]; then
echo -e '\E[37;44m'"\033[1mCreate tar arch\033[0m" ; tput sgr0
time tar cf $SAVEDIR$FILENAME-$DATE.tar $PORTDIR
echo -e '\E[37;44m'"\033[1mbzip2 file\033[0m" ; tput sgr0
time bzip2 $SAVEDIR$FILENAME-$DATE.tar
md5sum $SAVEDIR$FILENAME-$DATE.tar.bz2 >> $SAVEDIR$FILENAME-$DATE.tar.bz2.md5sum
ls -lh $SAVEDIR$FILENAME-$DATE.tar.bz2 | gawk '{ print $9"\t" $5}'
elif [ "$opt" = "Quit" ]; then
echo -e '\E[37;44m'"\033[1mQuit...\033[0m" ; tput sgr0
exit
elif [ "$opt" = "Erase" ]; then
echo -e '\E[37;44m'"\033[1mPlease enter date for delete:\033[0m" ; tput sgr0
read UDATE
rm -i $SAVEDIR$FILENAME-$UDATE.tar.bz2
rm -i $SAVEDIR$FILENAME-$UDATE.tar.bz2.md5sum
elif [ "$opt" = "Check" ]; then
echo -e '\E[37;44m'"\033[1mPlease enter date for check:\033[0m" ; tput sgr0
read UDATE
cd $SAVEDIR
md5sum -w -c $FILENAME-$UDATE.tar.bz2.md5sum
fi
done
Народ. Тэг "[code]"
Народ. Тэг "[code]" еще никто не отменял. Читать же невозможно =)/
Пишите назанечение скриптов
Народ, + пишите объяснение скриптов
В баше не очень
В баше не очень шарю.
Написал вот такую штуку включать-отключать флэш, а то часто опера виснет когда что-нибудь собирается и пытаешься посмотреть страницу на которой есть флэш.
просто переименовывает файл, может и через жопу, но во всяком случае с оперой срабатывает
А что,
А что, отключение по F12 уже не катит? (-:Е
Пожалуйста, не описывайте своё железо в подписи
FlashBlock плагин (userjs) к
FlashBlock плагин (userjs) к опере этим может занимаеться по-человечески.
Шкрыптец для
Шкрыптец для реализации XEP-0118 (Publish tune) в связке Psi+MPD
Пожалуйста, не описывайте своё железо в подписи
Поддался общей
Поддался общей графомании.
Полуплагиат, не помню уже где спёр идею, только "творчески" переработал :)
#!/bin/sh
# Скрипт для бэкапа моей домашней директории в зашифрованный с помощью EncFS каталог.
# Запускается ежедневно, раз в месяц делается полное резервирование в отдельный каталог.
# Таким образом, создаётся отдельный ежемесячный бэкап с ежедневрым инкрементным обновлением.
# Директории, которые используются программой EncFS, создаются заранее.
# Смотри man encfs.
# Определяем переменные и функции, пути к исполняемым файлам.
# Так как данный скрипт запускается при старте KDE,
# сделана задержка его исполнения, чтобы дать KDE загрузиться.
RUNTIME_DELAY="30"
# Директория, данные из которой нужно сохранить.
BACKUPED_DIR="${HOME}"
# Директории, данные из которых не нуждаются в сохранении.
EXCLUDE_DIR_1="${BACKUPED_DIR}/Desktop/Doc/private/foto"
EXCLUDE_DIR_2="${BACKUPED_DIR}/Desktop/Doc/private/video"
# Директория, в которой в зашифрованном виде хранятся данные.
ENCRYPT_DIR="/home/users/encrypt-backup"
# Директория, в которой находятся (виртуально) расшифрованные данные.
VIRT_ENCRYPT_DIR="/home/users/raw-backup"
# Директория, с ежемесячным бэкапом.
MONTHLY_BACKUP="${VIRT_ENCRYPT_DIR}/`date +%m-%Y`-`whoami`"
#
# Определяем полные пути к программам.
FUSERMOUNT=`which fusermount`
ENCFS=`which encfs`
KDIALOG=`which kdialog`
RDIFF_BACKUP=`which rdiff-backup`
# Опции команды rdiff-backup
# Исключить каталоги
EXCLUDE_OPT="--exclude ${EXCLUDE_DIR_1} --exclude ${EXCLUDE_DIR_2}"
# Включить каталоги
INCLUDE_OPT=""
#
RDIFF_BACKUP_OPT="${EXCLUDE_OPT}"
# Количество попыток подключёния зашифрованного раздела
ECRYPT_CHECK_NUM="3"
# Проверяем, делалось ли резервирование сегодня
CHECK_LOCK="${HOME}/home-rdiff.lock"
### ЗАПУСКАЕМ СКРИПТ ###
# Задержка при запуске
sleep ${RUNTIME_DELAY}
# Если lock-файла нет или он создан на несколько дней раньше, выполнить резервирование.
if [[ ! ( -f ${CHECK_LOCK} ) || $(cat ${CHECK_LOCK} ) -lt `date +%Y%j` ]];
# В предыдущей строке в date +%j дополнительно поставил %Y (год в формате YYYY),
# иначе с наступлением следующего года нумерация в CHECK_LOCK была бы больше текущей даты.
then
# Хотим ли мы делать резервирование.
if $(${KDIALOG} --title "Запланированное резервирование!" --yesno "Продолжить резервирование ${BACKUPED_DIR}?");
then
# Производить проверку, подключён ли зашифрованный раздел.
# Возможно, нужно ограничить количество попыток ввода пароля.
while [ "$(cat /proc/mounts | grep encfs | grep ${VIRT_ENCRYPT_DIR})" = "" ];
do
${KDIALOG} --title "Монтирование ${ENCRYPT_DIR}..." --password "Введите пароль. Количество попыток ${ECRYPT_CHECK_NUM}" | ${ENCFS} -S ${ENCRYPT_DIR} ${VIRT_ENCRYPT_DIR} || \
${KDIALOG} --sorry "Неверный пароль!"
# Счётчик уменьшаем на 1 после каждой попытки
ECRYPT_CHECK_NUM=`expr ${ECRYPT_CHECK_NUM} - 1`
if [ ${ECRYPT_CHECK_NUM} -eq 0 ];
then
# При неудачном вводе пароля выходим со статусом ошибки.
exit 1
fi
done
if [ ! -d ${MONTHLY_BACKUP} -o ! -w ${MONTHLY_BACKUP} ];
then
#${KDIALOG} --msgbox "Создаю папку"
mkdir -p ${MONTHLY_BACKUP}
fi
#${KDIALOG} --msgbox "Резервирование ${BACKUPED_DIR} ..."
if $(${RDIFF_BACKUP} ${RDIFF_BACKUP_OPT} ${BACKUPED_DIR} ${MONTHLY_BACKUP} );
then
if $(${FUSERMOUNT} -u ${VIRT_ENCRYPT_DIR} );
then
${KDIALOG} --msgbox "Резервирование ${BACKUPED_DIR} закончено успешно"
# Создаём временную метку созданного бэкапа.
# В предыдущей строке в date +%j дополнительно
# поставил %Y (год в формате YYYY),
# иначе с наступлением следующего года
# нумерация в CHECK_LOCK была бы больше текущей даты.
echo "`date +%Y%j`" > ${CHECK_LOCK}
else
${KDIALOG} --error "Не могу размонтировать ${VIRT_ENCRYPT_DIR}, устройство занято!"
fi
else
${KDIALOG} --error "Резервирование ${BACKUPED_DIR} закончено с ошибками!"
fi
else
${KDIALOG} --sorry "Резервирование отменено!"
#exit 1
# Возможно использовать код выхода для контроля выполнения резервирования.
fi
fi
P. S. Скрипт следует поместить в ~/.kde3.5/Autostart
Для извлечения в случае необходимости сохранённых бэкапов (man rdiff-backup) написал, точнее "творчески" переработал ещё один скриптик:
#!/bin/sh
# В первом аргументе скрипта передаётся путь к директории с зашифрованными данными.
SRC=$1
# Во втором аргументе - точка монтирования для расшифровки
DST=$2
KDIALOG=`which kdialog`
FUSERMOUNT=`which fusermount`
KONQUEROR=`which konqueror`
ENCFS=`which encfs`
if [ "$(cat /proc/mounts | grep encfs | grep $DST)" != "" ];
then
$(${KDIALOG} --title "encFS: Отмонтирование $DST..." --warningyesno "encFS: Хотите $DST отмонтировать?")
if [ $? == 0 ]
then
${FUSERMOUNT} -u $DST &
else
${KONQUEROR} $DST &
fi
else
$(${KDIALOG} --title "encFS: Монтирование $DST..." --warningyesno "encFS: Хотите монтировать $DST ?")
if [ $? == 0 ]
then
${KDIALOG} --title "encFS: Пароль..." --password "Ввод пароля для [$DST]" | ${ENCFS} -S
fi
fi
В KDE'шном меню создал пункт "Проверка архива", где в строку "Команда" ввёл
/home/lupo/bin/mountsafe.sh /home/users/encrypt-backup /home/users/raw-backup
инкрементальное резервирование, не привязанное ко времени
Выложу свой скриптик для резервирования, + его в том, что может выполняться в любой момент и всегда доступно наперёд заданное число бэкапов.
То есть, решена проблема, когда что-то испортилось, а пользователь ещё не успел заметить, но уже сделана новая полная резервная копия.
Число хранимых полных резервных копий и промежуточных регулируется, выполнение скрипта возможно в любой момент. Дополнительно производится синхронизация общих бэкапов с сервером. Для каждого хоста создаётся своя директория в синхронизируемых папках, пример папок такой:
mirror
host1
дата-время-full
дата-время
дата-время
дата-время
дата-время-full
дата-время
дата-время
дата-время
дата-время-full
дата-время
дата-время
host2
дата-время-full
дата-время
дата-время
дата-время-full
дата-время
дата-время
дата-время-full
дата-время
дата-время
дата-время-full
Устаревшие бэкапы и инкрементальные, для кт. отсутствуют полные рез. копии (по причине устаревания или просто, если юзер удалил) автоматически удаляются.
#!/bin/bash # -------------------- НАСТРОЙКИ -------------------- ARC_DIR="/home/bkp" # хранилище резервных копий ARC_SYNC_DIR="/mnt/ftp.myserver/bkp" # зеркало хранилища, если пустое, то зеркалирование не выполняется USR_DIRS="/home/pupkin /home/vasya /home/ftp" # пользовательские директории для резервирования USR_EXCL="" # исключения SYS_DIRS="/bin /boot /etc /lib32 /lib64 /opt /root /sbin /usr /var" # системные директории для резервирования SYS_EXCL="/var/tmp" # исключения FULL_NUM=2 # кол-во хранимых полных копий INCR_NUM=8 # кол-во инкр. копий между полными копиями TAR="nice -n 19 ionice -c2 -n7 tar czp --one-file-system -f" # команда архивирования EXT="tgz" # -------------------- ПЕРЕМЕННЫЕ -------------------- NOW=`date +%Y%m%d\ %H:%M:%S` HOSTNAME=`hostname` ARC_DIR_HOST="$ARC_DIR/$HOSTNAME" ARC_SYNC_DIR_HOST="$ARC_SYNC_DIR/$HOSTNAME" DIRS="$SYS_DIRS $USR_DIRS" EXCL="$SYS_EXCL $USR_EXCL" # -------------------- ФУНКЦИИ -------------------- # Удаление "сломанных" инкрементальных копий, # для которых не найдена полная копия function rm_brok_incr { for dir in `ls $ARC_DIR_HOST`; do full_arc_dirname=`cat $ARC_DIR_HOST/$dir/full-arc-dirname 2>/dev/null` if [[ ( "$?" != "0" || ! -d $ARC_DIR_HOST/$full_arc_dirname ) && "`echo $dir|grep full`" == "" ]]; then rm -rf $ARC_DIR_HOST/$dir fi done } # -------------------- MAIN -------------------- # создаём необходимые каталоги mkdir -p $ARC_DIR_HOST $ARC_SYNC_DIR_HOST # удаляем мусор rm_brok_incr # дата последней полной копии LAST_FULL_DIR=`ls $ARC_DIR_HOST|grep full|tail -n1` LAST_FULL_TIME=`echo $LAST_FULL_DIR|sed 's/-full//;s/\.//g;s/_/ /'` # кол-во сделанных инкр. копий INCR_COUNT=0 for dir in `ls $ARC_DIR_HOST`; do if [[ "`echo $dir|grep full`" != "" ]]; then INCR_COUNT=0 else INCR_COUNT=$(($INCR_COUNT+1)) fi done # если кол-во инкр. копий превысило INCR_NUM, # то необходимо делать новую полную резервную копию if [[ $INCR_COUNT -ge $INCR_NUM ]]; then LAST_FULL_DIR="" LAST_FULL_TIME="" fi # выбор копии - полная или инкр. BKP_DIRNAME=`date -d "$NOW" +%Y.%m.%d_%H:%M:%S` if [[ "$LAST_FULL_DIR" == "" ]]; then # ----- полная копия BKP_DIRNAME=$BKP_DIRNAME-full mkdir -p $ARC_DIR_HOST/$BKP_DIRNAME # создаём полную резервную копию for dir in $DIRS; do dir_compatible_name="`echo $dir|sed 's/^\.//; s/^\///; s/\//^/g'`" $TAR $ARC_DIR_HOST/$BKP_DIRNAME/$dir_compatible_name.$EXT $dir --exclude "$EXCL" done else # ----- инкрем. копия mkdir -p $ARC_DIR_HOST/$BKP_DIRNAME echo $LAST_FULL_DIR > $ARC_DIR_HOST/$BKP_DIRNAME/full-arc-dirname NEWER=`date -d "$LAST_FULL_TIME" +%Y-%m-%d\ %H:%M:%S` # создаём резервную копию for dir in $DIRS; do dir_compatible_name="`echo $dir|sed 's/^\.//; s/^\///; s/\//^/g'`" $TAR $ARC_DIR_HOST/$BKP_DIRNAME/$dir_compatible_name.$EXT $dir --newer "$NEWER" --exclude "$EXCL" done fi # удаление старых резервных копий for dir in `ls $ARC_DIR_HOST|grep full|head -n -$FULL_NUM`; do rm -rf $ARC_DIR_HOST/$dir done # удаляем мусор rm_brok_incr # синхронизируем с зеркалом if [[ "$ARC_SYNC_DIR" != "" ]]; then rsync -rt --delete $ARC_DIR_HOST/ $ARC_SYNC_DIR_HOST && rsync -rt --delete $ARC_SYNC_DIR/ $ARC_DIR fiЕсли ничего не было, то как могло что-то появиться? А если все-таки что-то было, то откуда тогда оно взялось? Нашу Вселенную породила Рекурсия!
Похоже на переизобретение
Похоже на переизобретение app-backup/rsnapshot
Текстовый редактор vi имеет два режима работы: в первом он пищит, а во втором — всё портит.
Похоже, не смотрели даже =)
rsnapshot может быть запущен с интервалом в несколько секунд, если Вы работаете в системе и Вам необходимо сохранять все снимки ф.с. каждые 0.017-5 минут?
Скорость выполнения задачи rsnapshot-ом сравнима со скоростью алгоритма однократного обхода дерева файловой системы с прямой подстановкой условий?
Все входные данные для скрипта берутся из директории с бэкапами и являются достаточными для определения того, что уже не требуется и что было удалено по желанию пользователя, в то время как для работы rsnaphot необходимо возиться с файлами конфигурации. Особенно это ощутимо, когда Вам нужно на час-другой настроить авто-бэкап разрабатываемого проекта или Вы просто пришли посидеть за чужим компьютером.
Сравните громоздкость программы rsnapshot на perl и прозрачность bash-скрипта. =)
+ bash-скрипт каждый может модифицировать в соответствии с его требованиями, мне понадобился один вечер, чтобы придумать и реализовать нужный мне алгоритм на bash, которые делает то, что нужно именно мне.
Если ничего не было, то как могло что-то появиться? А если все-таки что-то было, то откуда тогда оно взялось? Нашу Вселенную породила Рекурсия!
и Вам необходимо сохранять
освой icron , если уж на то пошло
Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)
slepnoga написал(а): и Вам
Спасибо за совет! А что это, если не секрет?
Как альтернатива, такая команда:
Если ничего не было, то как могло что-то появиться? А если все-таки что-то было, то откуда тогда оно взялось? Нашу Вселенную породила Рекурсия!
займусь некрофилией (-:Е (с)Krigstask
скрипт, выполняет, обновление системы, обновление базы esearch, затем проводит emerge -pvuDN world, glsa-check (на наличие уязвимых пакетов), затем фильтрует вывод и отправляет по почте через ssmtp который идет в gentoo как MTA по дефолту. чтобы скрипт оправлял почту нужно настроить ssmtp настройка сводится к простой правке /etc/ssmtp/ssmtp.conf
root=yourmail@domain.com
mailhub=mx.domain.com:25
hostname=mx.domain.com:25
FromLineOverride=YES
UseSTARTTLS=YES
AuthUser=yourmail@domain.com
AuthPass=yourpassword
ну и сам скрипт
#!/bin/bash LIST="/tmp/list" MAILTO="lesovsky_av@uzps.mh.ru" rm $LIST emerge --sync; eudatedb; echo "Subject: `hostname` emerge notification" >> $LIST echo -e "\n `date -R`" >> $LIST echo '######## emerge -uDN world information ########' >> $LIST emerge -pvuDN world |awk -F ] '{print $2}' |awk -F [ '{print $1}' |awk '{print $1}' |uniq >> $LIST echo '######## GLSA-CHECK information ########' >> $LIST glsa-check -l affected >> $LIST cat $LIST | ssmtp $MAILTO+ 1
наверняка многие админы шлюзов и проксей сталкивались с клиент-банками, через прокси они работать не хотят, подавай им реальный айпишник... так вот наверняка приходилось их натить, и для каждого такого клиента вписывать в правила соответвующуюю строчку типа, iptables -t nat -A POSTROUTING -s 192.168.0.5 -d 85.24.16.68 -p tcp --dport 8452 -j SNAT --to-source $REAL_IP.
так вот обленившись в очередной раз я решил написать скрипт, который сам прописывает параметры клиентов и адресов с портами банков в правила для iptables. в итоге получилось что нужно вести текстовый файл, в котором посторочно перечислены 'клиент моей сетки' 'адрес банка' 'порт банка'.
В скрипте цикл который читает строку и распихивает эти парметры в строку для iptables. получилось вот что.
#!/bin/bash TEXTFILE="/root/temp/addresses" while read src dst dport; do iptables -t nat -A POSTROUTING -s $src -d $dst -p tcp --dport $dport -j SNAT --to-source 212.220.129.40" done < $TEXTFILEпроверено, работает. Этот цикл у меня воткнут в набор правил где происходит формирование nat-цепочек
Друзья! Помогите плз! Тема
Друзья! Помогите плз! Тема такая что надо написать скриптик на BASH, который прописывает прокси в систему, т.е что бы при поключении к одной точке доступа было прокси а при подключении к другим не было. Напишете хоть алгоритм действий или не обходимые команды.
Ну, можно сделать это через
Ну, можно сделать это через post_up в /etc/conf.d/net, к примеру.
Текстовый редактор vi имеет два режима работы: в первом он пищит, а во втором — всё портит.
Я бы monit заюзал.
Я бы monit заюзал.
OpenVPN
Проверка доступен или нет впн сервер, если не доступен то делаем рестарт служб.
Информация записывается в файл лога, всегда можно видеть что и как было.
Скрипт запускаю у себя по кронтабу, каждую минут.
Может кому понадобится...
#!/bin/sh VPN_SERVER="10.10.0.1" GUEST_DEV="ppp1" TIME_RESTART_CONNECTION="30" LOGFILE="/var/log/vpn_status" echo "Start scripts check status"; date >> ${LOGFILE}; echo "Start scripts check status" >> ${LOGFILE}; if ping -c 3 ${VPN_SERVER} &> /dev/null then echo "VPN Connect - Ok"; echo "VPN Connect - Ok" >> ${LOGFILE}; else echo "VPN Connect - Down"; echo "VPN Connect - Down" >> ${LOGFILE}; /etc/init.d/net.${GUEST_DEV} restart; echo "net.${GUEST_DEV} restart" >> ${LOGFILE}; sleep 5; /etc/init.d/openvpn restart; echo "Openvpn restart" >> ${LOGFILE}; sleep 5; echo "VPN Service was restarted"; echo "VPN Service was restarted" >> ${LOGFILE}; sleep ${TIME_RESTART_CONNECTION}; echo "Try connect again"; echo "Try connect again" >> ${LOGFILE}; if ping -c 3 ${VPN_SERVER} &> /dev/null then echo "VPN Connect after restart service- Ok"; echo "VPN Connect after restart service- Ok" >> ${LOGFILE}; else echo "VPN Connect after restart service - Down"; echo "VPN Connect after restart service - Down" >> ${LOGFILE}; fi fi echo "End scripts check status"; echo "End scripts check status" >> ${LOGFILE}; date >> ${LOGFILE}; echo "==========================================================" >> ${LOGFILE};Почему не сделать через опции
Почему не сделать через опции самого pppd (persist)?
...
небольшая специфика работы.. засчет этого иногда при созданном пппое соединении не пингуется сервер..
это вопросы к провайдеру, но когда пытаешся говорить с ним, толка так и не появляется..
поэтому пришлось вот придумывать..
т.е. когда pppoe соединение падает, то у меня оно само подымается.
Примитивный скрипт для логов,
Примитивный скрипт для логов, делал для себя
Все просто, при включении проверяем существует ли папка, если нет, создаем и делаем симлинк. Плюс в силу особенностей времяпрепровождения за шайтан машиной, еще пара команд, так же весьма понятных...
#!/bin/bash ### Simple LogDB ### GPL-v2 ### joy4eg[at]gmail.com ### Var ### user="userx" LogDB="/var/log" db="/var/LogDB" mhs=$(date +%m) year=$(date +%Y) mhh=$(echo $mhs -1 | bc).$year day=$(date +%d) dc="$db/DC/$mhs.$year/$day" homedc="/home/$user/.config/eiskaltdc++/Logs" LANG=C ### if [[ ! -d "$db/$mhs.$year/$day" ]]; then mkdir -p $db/$mhs.$year/$day rm $LogDB -f ln -s -f $db/$mhs.$year/$day $LogDB touch $LogDB/torrent.transmission chmod 700 $LogDB/torrent.transmission chown $user:$user $LogDB/torrent.transmission mkdir $LogDB/{paludis,tor} chmod 755 $LogDB/paludis chown paludisbuild:paludisbuild $LogDB/paludis -R chown tor:tor $LogDB/tor -R chmod 755 $LogDB/tor -R ### EiskaltDC++ LogDB mkdir -p $dc chmod 700 $dc -R chown $user:$user $dc -R rm $homedc -f sudo -u $user ln -s $dc $homedc else exit 0 fi ### Bak ### if [ "$day" -eq "1" ]; then if [[ -d "$db/$mhh" ]]; then tar -czf $db/$mhh.tar.gz $db/$mhh fi fiВсе мы, рано или поздно, будем там...
отдельный раздел или блог
думается мне что в одной нити форума постить кучу скриптов и тут же их обсуждать как то плохо выглядит.
надо либо отдельный раздел под это выделять, либо модерируемый блог для всех или еще чего нибудь.
а то совсем каша получается, а вот инфа хорошая ...
на 100% согласен!
Поддерживаю!
Деление по целевому назначению.
Если ничего не было, то как могло что-то появиться? А если все-таки что-то было, то откуда тогда оно взялось? Нашу Вселенную породила Рекурсия!