Версия для печати темы
forum.0day.community _ Системное администрирование _ Скрипты для системных администраторов *NIX
Автор: pilson Dec 24 2010, 16:59
Предлагаю в этой теме делиться различными скриптами для маленьких и не очень нужд, для облегчения жизни себе, любимым
В основном для Bash, PERL, AWK, но также приветствуется и остальное.
Автор: reiten Dec 24 2010, 17:55
Для бытовых нужд:
Перегонка cue+flac в mp3
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «
#!/bin/bash
LAME_OPTS="-h -V 0"
function set_metadata {
TITLE=`cueprint -t "%t" -n $2 "$1"`
ALBUM=`cueprint -t "%T" -n $2 "$1"`
ARTIST=`cueprint -t "%p" -n $2 "$1"`
COMMENT=`cueprint -t "%c" -n $2 "$1"`
GENRE=`cueprint -t "%g" -n $2 "$1"`
TRACKNUMBER=$2
YEAR=`grep "REM DATE" "$1" | sed "s/REM DATE \([0-9]*\).*/\\1/"`
id3v2 -a "${ARTIST}" -A "${ALBUM}" -t "${TITLE}" -c "${COMMENT}" -g "${GENRE}" -y "${YEAR}" -T "${TRACKNUMBER}" "$3"
}
function main {
echo "Splitting ${FLAC_FILE}..."
cuebreakpoints "${CUE_FILE}" | shnsplit -q -o wav -a "Track-" "${FLAC_FILE}"
cuetag "${CUE_FILE}" Track-*.flac
for TRACK_NO in $(seq -w 01 ${TRACK_CNT}); do
WAV_FILE="Track-${TRACK_NO}.wav"
MP3_FILE=`cueprint -t "%02n - %t\n" -n ${TRACK_NO} "${CUE_FILE}"`.mp3
echo "Encoding ${MP3_FILE}..."
lame ${LAME_OPTS} "${WAV_FILE}" "${MP3_FILE}"
set_metadata "${CUE_FILE}" ${TRACK_NO} "${MP3_FILE}"
rm -f "${WAV_FILE}"
done
}
CUE_FILE="$1"
if [ ! -f "${CUE_FILE}" ]; then
echo "ERROR: File \"${CUE_FILE}\" not found."
exit 1
fi
FLAC_FILE=`dirname "${CUE_FILE}"`/`grep FILE "${CUE_FILE}" | sed "s/FILE \"\([^\"]*\)\".*/\\1/"`
TRACK_CNT=`cueprint -d "%N" "${CUE_FILE}"`
main
Регулярный инкрементальный бекап данных (запускается по крону, для рабочей станции самое оно):
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «
#!/bin/sh
#--------------------------------------------------------------------------------
#This script backups precious data from /home
#--------------------------------------------------------------------------------
#----- system commands ----------------------------------------------------------
CP=/bin/cp;
RSYNC=/usr/bin/rsync;
READLINK=/bin/readlink;
ID=/usr/bin/id;
ECHO=/bin/echo;
DATE=/bin/date;
MKDIR=/bin/mkdir;
LN=/bin/ln;
RM=/bin/rm;
#------ working paths and parameters --------------------------------------------
BACKUPROOT=/freeagent/ext3/backup;
BACKUPSOURCE="/home/reiten /home/roman";
BACKUPNAME="backup.`date '+%Y-%m-%d.%H:%M'`";
BACKUPLASTEST=backup.actual;
EXCLUDEFROM=/freeagent/ext3/backup/config/exclude.conf;
LOCKFILE=/freeagent/ext3/backup/config/lock
#------ the script --------------------------------------------------------------
# echo $NAMETEMPLATE
if [ `id -u` != 0 ]; then
$ECHO "This script must be runned by root";
exit 1;
fi
cd $BACKUPROOT;
if [ -d $BACKUPNAME ]; then exit; fi;
if [ -f $LOCKFILE ]; then
$ECHO "Another copy of this script is running right now.";
exit 1;
else
$ECHO $$ > $LOCKFILE;
fi
$ECHO "Backup at `date '+%Y-%m-%d %k:%M'`"
if [ -L $BACKUPLASTEST ]; then
$CP -al "$($READLINK $BACKUPLASTEST)" $BACKUPNAME;
else
$MKDIR $BACKUPNAME;
fi;
$RSYNC -a --delete --delete-excluded --exclude-from=$EXCLUDEFROM $BACKUPSOURCE ./$BACKUPNAME;
if [ $? != 0 ]; then
$ECHO "backup process was interrupted";
$RM -f $LOCKFILE
exit 1;
fi
$RM -f $BACKUPLASTEST;
$LN -fs $BACKUPNAME $BACKUPLASTEST;
$RM -f $LOCKFILE
Автор: pilson Jan 5 2011, 13:49
Скрипт автоматизации создания SVN репозиториев и назначение пользователя, группы и прав на созданный репозиторий.
В качестве параметра скрипту указывается имя репозитория, который нужно создать. Можно указывать несколько репозиториев сразу, через пробел. Если параметр отсутствует - скрипт завершается с ошибкой.
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «
#!/bin/bash
###path to repos root
svnpath="/opt/svn/repos"
user="www-data"
group="svn"
if [ -n "$1" ]; then
for t in $*; do
svnadmin create --fs-type fsfs ${svnpath}/${t}/
chown -R ${user}:${group} ${svnpath}/${t} && chmod ug+w ${svnpath}/${t} -R
done
else
echo "Error: missing parameter. Use: $0 repo-name"
fi
Автор: gonivo Jan 9 2011, 1:07
Вот скрипт сваял для сервака обновления Nod32
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «
#!/bin/sh
loc='/etc/nod'
site=http://update.eset.com
#site=http://um10.eset.com
for ((aaa=1; aaa <= 5 ; aaa++))
do
log=`cat $loc/lib/nod32.auth | grep "username" | sed s/"username="//g`
pass=`cat $loc/lib/nod32.auth | grep "password" | sed s/"password="//g`
rm -f $loc/update.ver
rm -f $loc/arh/update.ver
rm -f $loc/wg_log
rm -f $loc/url
site1=`echo $site | sed 's/\\//\\\\\//g'`
echo '---------------------------------------' >> $loc/nod.log
date >> $loc/nod.log
wget --http-user=$log --http-passwd=$pass $site/eset_upd/update.ver -a $loc/nod.log -P $loc/arh
if [ $? != 0 ]
then
echo error connect >>$loc/log
exit 1
fi
unrar -f $loc/arh/update.ver $loc >> $loc/nod.log
#cp -f $loc/update.ver /var/www/html/v3/update.ver
sleep 2
cat $loc/update.ver | grep "file=" | sed s/"file="//g | sed s/^/$site1/g | sed 's/.$//g' >$loc/url
LANG=en_US.UTF-8 wget --http-user=$log --http-passwd=$pass -x -nH -N -i $loc/url -o $loc/wg_log -P /var/www/html
nr=`cat $loc/wg_log | grep 'Server file no newer than local file' -c`
sd=`cat $loc/wg_log | grep "' saved \[" -c`
af=`cat $loc/wg_log | grep 'Authorization failed.' -c`
nurl=`cat $loc/url | grep "http" -c`
let res=nr+sd+af
echo files not retrieving $nr >> $loc/nod.log
echo files saved $sd >> $loc/nod.log
echo Authorization failed $af >> $loc/nod.log
echo summa $res >> $loc/nod.log
echo N url $nurl >> $loc/nod.log
LANG=en_US.UTF-8 wget --http-user=$log --http-passwd=$pass -N -q http://download.eset.com/download/win/eavbe/eavbe_nt32_rus.msi -P /var/www/html/install
LANG=en_US.UTF-8 wget --http-user=$log --http-passwd=$pass -N -q http://download.eset.com/download/win/eavbe/eavbe_nt64_rus.msi -P /var/www/html/install
nurl2=$(echo "scale=0; $nurl/4" | bc)
if [ $af -gt $nurl2 ]; then
$loc/updkey.pl
else
if [ $res -eq $nurl ]; then
aaa=90
#echo $nurl2
fi
fi
done
Создавался как замена обновляющей части одноименного скрипта с сайта лиссяры - оный после обновления перла стал глючить, но главная изюминка автонагугливание ключиков работает.
Eсли создать каталог ./loc и в него положить nod32.auth с строками username= password= то будет работать и сам.
Ну и + скачка свежих версий инсталлов нода
Автор: pilson Jan 10 2011, 17:39
Если автор предыдущего скрипта не против - то выкладываю немного допиленную версию этого же скрипта. Структура приведена в более классический, читабельный вид, некоторые части кода облегчены (упрощен алгоритм получения некоторых переменных за счет удаления промежуточных механизмов).
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «
#!/bin/bash
loc="/etc/nod"
site=http://update.eset.com
#site=http://um10.eset.com
for ((aaa=1; aaa <= 5; aaa++)); do
log=$(grep "username" $loc/lib/nod32.auth| sed s/"username="//g)
pass=$( grep "password" $loc/lib/nod32.auth| sed s/"password="//g)
rm -f $loc/update.ver
rm -f $loc/arh/update.ver
rm -f $loc/wg_log
rm -f $loc/url
site1=$(echo $site | sed 's/\\//\\\\\//g')
echo "---------------------------------------" >> $loc/nod.log
date >> $loc/nod.log
wget --http-user=$log --http-passwd=$pass $site/eset_upd/update.ver -a $loc/nod.log -P $loc/arh
if [ $? != 0 ]; then
echo "connection error" >>$loc/log
exit 1
fi
unrar -f $loc/arh/update.ver $loc >> $loc/nod.log
#cp -f $loc/update.ver /var/www/html/v3/update.ver
sleep 2
grep "file=" $loc/update.ver | sed s/"file="//g | sed s/^/$site1/g | sed 's/.$//g' >$loc/url
LANG=en_US.UTF-8 wget --http-user=$log --http-passwd=$pass -x -nH -N -i $loc/url -o $loc/wg_log -P /var/www/html
nr=$(grep "Server file no newer than local file" $loc/wg_log -c)
sd=$(grep "' saved \[" $loc/wg_log -c)
af=$(grep "Authorization failed." $loc/wg_log -c)
nurl=$(grep "http" $loc/url -c)
let res=nr+sd+af
echo files not retrieving $nr >> $loc/nod.log
echo files saved $sd >> $loc/nod.log
echo Authorization failed $af >> $loc/nod.log
echo summa $res >> $loc/nod.log
echo N url $nurl >> $loc/nod.log
LANG=en_US.UTF-8 wget --http-user=$log --http-passwd=$pass -N -q http://download.eset.com/download/win/eavb...be_nt32_rus.msi -P /var/www/html/install
LANG=en_US.UTF-8 wget --http-user=$log --http-passwd=$pass -N -q http://download.eset.com/download/win/eavb...be_nt64_rus.msi -P /var/www/html/install
nurl2=$(echo "scale=0; $nurl/4" | bc)
if [ $af -gt $nurl2 ]; then
$loc/updkey.pl
elif [ $res -eq $nurl ]; then
aaa=90
#echo $nurl2
fi
done
Автор: ssslav77 Apr 7 2011, 8:14
Вот скриптик для рестарта conky (иногда в процесах висит, а на рабочем столе ничего не отображает):
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «
#!/bin/bash
killall conky
sleep 5 && conky
exit 0
Коротко и ясно)
..создал скриптик, выложил на рабочий стол ярлычек - и все)
Установка "нужной" даты в виртуальной машине VirtualBox (из-под Ubuntu):
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «
#!/bin/bash
DefinedDate="2010-05-01"
VM_Name="MyVM"
# Adjust VM BIOS time to a given date
secsWasTonight=$(date --date "$*" +%s) # convert supplied date to secs, since 1970-01-01
secsWas_DefDateNight=$(date -d $DefinedDate +%s) # convert supplied date to secs, since 1970-01-01
offset=$(($secsWas_DefDateNight - $secsWasTonight))
offsetDays=$(($offset / 86400))
msecs=$(( $offset * 1000 )) # convert to millis
echo "Offset= $msecs miliseconds = $offset seconds = $offsetDays days."
# echo Adjusting time ${msecs}ms
echo "Setting time offset to our Virtual Machine '$VM_Name':
for this we will use this comand:
VBoxManage modifyvm $VM_Name --biossystemtimeoffset ${msecs}"
echo "Uncoment folowing string!!!
P/S: Your VM (and may be VirtualBox) Mast be SHUTted DOWN!!!!!!!
"
VBoxManage modifyvm $VM_Name --biossystemtimeoffset ${msecs}
exit 0
Попрятал под спойлер
Автор: Freestyler Apr 19 2011, 9:36
Возникла необходимость частенько отправлять команду в работающий скрин при этом не заходя в него, написал простой скрипт.
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «
#!/bin/bash
sname=пишем имя скрина
echo "Скрипт отправки команды в screen"
echo "Что отправить?"
read command
screen -S $sname -X stuff "$command"`echo -ne '\015'`
echo "Готово"
Автор: nerve Oct 1 2011, 19:00
помогите решить такую задачу:
есть n интерфейсов, которые получают адрес, маску, шлюз и днс по дхцп.
надо:
- потушить все интерфейсы
#!/bin/sh
ifconfig n1 down
ifconfig n2 down
- по-очереди включить каждый и для верности запустить получение адреса по дхцп
ifconfig n1 up
dhclient n1
- парсить вывод netstat -rn на предмет дефолтного шлюза
netstat -rn | grep default
default 1.1.1.1 UGS 12 73504426 - 8 fxp1
- или, если система смогла получить два значения параметра default, то парсим эти два адреса
netstat -rn | grep default
default 1.1.1.1 UGS 11 73406860 - 8 fxp1
default 2.2.2.2 UGS 11 73406860 - 8 fxp2
- если не смогла получить два шлюза, то выключаем n1, включаем n2 и находим значение другого шлюза
ifconfig n1 down
ifconfig n2 up
dhclient n2
netstat -rn | grep default
default 2.2.2.2 UGS 11 73406860 - 8 fxp2
- смотрим файл и вносим значение шлюза1 в первую попавшуюся строку $ext_gw1 = "сюда",
а шлюза2 в строку $ext_gw2 = ""
cat /etc/pf.conf | grep ext_gw1
ext_gw1 = "3.3.3.3"
- заносим значение любого из найденных шлюзов в файлик
echo '1.1.1.1' > /etc/mygate
включаем выключенные интерфейсы и получаем для них адреса. с большой долей вероятности после выкл/вкл параметр пары адрес-шлюз останется тот же. если же сменится, то запускаем скрипт второй раз или просто запускаем его два раза для надежности)
- ну и релоад конфига
pfctl -f /etc/pf.conf
надо для НАТ-а соурса в разные сетки через некстхоп, поэтому нужен параметр шлюза, чтоб корректно отрабатывать автоматом, после конца аренды выданного адреса.
Автор: I00matolog Nov 29 2011, 21:05
Есть список доменов
Надо както пробежатся по ним и посмотреть кто из них отдает телнет на 80 порт.
И сооветственно на вывод вывести - если есть 80 порт - живой домен, если нет то мертвый.
Оптимально баш.
Памажите пожалуйста.
Автор: pilson Nov 29 2011, 21:24
Синторрес погорячился, однако Причем тут виндовс?
Если навскидку - то:
for t in $(cat 1.txt); do echo -n "$t "; nmap $t -p 80 -P0 | awk '/80\/tcp/ {print $2}'; done
ya.ru open
google.com open
brig.emict.com filtered
1c.ru open
piccy.info open
Автор: I00matolog Nov 29 2011, 21:42
(pilson @ Nov 29 2011, 21:24)
Синторрес погорячился, однако
Причем тут виндовс?
Если навскидку - то:
for t in $(cat 1.txt); do echo -n "$t "; nmap $t -p 80 -P0 | awk '/80\/tcp/ {print $2}'; done
ya.ru open
google.com open
brig.emict.com filtered
1c.ru open
piccy.info open
видимо у нас разные nmap. ваш синтаксис не подходит.
telnet hvost-oruzhie.com.ua 80
Trying 62.149.9.28...
Connected to hvost-oruzhie.com.ua.
Escape character is '^]'
[root@evaxua ~]# nmap hvost-oruzhie.com.ua -p 80 -P0
Starting Nmap 5.00 ( http://nmap.org ) at 2011-11-29 21:41 EET
Nmap done: 1 IP address (0 hosts up) scanned in 0.29 seconds
[root@evaxua ~]# nmap hvost-oruzhie.com.ua -p 80 -P0 | awk '/80\/tcp/ {print $2}';
Автор: pilson Nov 29 2011, 21:48
(I00matolog @ Nov 29 2011, 21:42)
видимо у нас разные nmap. ваш синтаксис не подходит.
[root@evaxua ~]# nmap hvost-oruzhie.com.ua -p 80 -P0
Starting Nmap 5.00 ( http://nmap.org ) at 2011-11-29 21:41 EET
Nmap done: 1 IP address (0 hosts up) scanned in 0.29 seconds
[root@evaxua ~]# nmap hvost-oruzhie.com.ua -p 80 -P0 | awk '/80\/tcp/ {print $2}';
Замечал в дебиане такой глюк. Из-под пользователя (не из-под рута) работает нормально, проверь.
Также еще попробуй в nmap не "-P0", а "-PN"
Автор: I00matolog Nov 29 2011, 22:05
(pilson @ Nov 29 2011, 21:48)
Замечал в дебиане такой глюк. Из-под пользователя (не из-под рута) работает нормально, проверь.
Также еще попробуй в nmap не "-P0", а "-PN"
неа..не пашет.
[root@evaxua ~]# nmap hvost-oruzhie.com.ua -p 80 -PN | awk '/80\/tcp/ {print $2}';
[root@evaxua ~]# nmap hvost-oruzhie.com.ua -p 80 -PN
Starting Nmap 5.00 ( http://nmap.org ) at 2011-11-29 22:00 EET
Nmap done: 1 IP address (0 hosts up) scanned in 0.29 seconds
это бсд
[root@evaxua ~]# uname -a
FreeBSD evaxua 7.0-RELEASE FreeBSD 7.0-RELEASE #0: Tue Sep 9 15:06:38 EEST 2008 admin@evaxua:/usr/src/sys/i386/compile/EVAX-UA i386
[root@evaxua ~]# nmap -v
Starting Nmap 5.00 ( http://nmap.org ) at 2011-11-29 22:00 EET
зы. фаер
[root@evaxua ~]# ipfw show
00100 33302273 49381428704 allow ip from any to any via lo0
00200 0 0 deny ip from any to 127.0.0.0/8
00300 0 0 deny ip from 127.0.0.0/8 to any
65000 1065996244 576900582440 allow ip from any to any
65535 0 0 deny ip from any to any
Автор: pilson Nov 29 2011, 22:07
покажи man nmap
Автор: I00matolog Nov 29 2011, 22:09
(pilson @ Nov 29 2011, 22:07)
покажи man nmap
он здоровенный.. та я копипастнул скрипты на дебиан - там завелось.пасиба.
Автор: rayder Nov 30 2011, 10:33
как вариант еще проверять скриптой из nrpe/nagios check_http,
#./check_http <domain>
HTTP OK: HTTP/1.0 302 Found - 635 bytes in 0.100 second response time |time=0.100290s;;;0.000000 size=635B;;;0
#./check_http <domain>
HTTP WARNING: HTTP/1.0 404 Not Found
#./check_http <domain>
Connection refused
HTTP CRITICAL - Unable to open TCP socket
ну и на основе ответа и/или error кода уже выдавать ответ
Автор: smeegul Nov 30 2011, 15:10
Перезапуск упавшего bind-а(для debian):
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «
cat ./bind_check
#!/bin/bash
ps axu|grep bind |grep -v grep |grep -v bind_check &>/dev/null
REK=$?
if [ $REK = "1" ];then
/etc/init.d/bind9 stop
/etc/init.d/bind9 stop
killall -15 named
sleep 10
killall -9 named
killall -9 named
killall -9 named
/etc/init.d/bind9 start
fi
Автор: fli Sep 21 2012, 14:12
Не подскажите как сделать зеркалирования одной папки в другую?
Автор: Pilson Sep 21 2012, 14:19
(fli @ Sep 21 2012, 15:12)
Не подскажите как сделать зеркалирования одной папки в другую?
rsync -a /source/ /destination/
Автор: fli Sep 21 2012, 14:39
(Pilson @ Sep 21 2012, 15:19)
rsync -a /source/ /destination/
Хм, только если удалить файлы из source, в destination они не удаляются.
Автор: Pilson Sep 21 2012, 15:03
(fli @ Sep 21 2012, 15:39)
Хм, только если удалить файлы из source, в destination они не удаляются.
man rsync
man rsync | grep delete
Автор: baltazor Sep 21 2012, 16:58
(fli @ Sep 21 2012, 15:39)
Хм, только если удалить файлы из source, в destination они не удаляются.
через rsync можно синхронизировать рекурсивно: добавление новых файлов, удаление, обновление сущ. файлов
А так, тут хорошо расписано: http://www.opennet.ru/man.shtml?topic=rsync&category=1&russian=0
Автор: Navern Sep 21 2012, 22:54
Простенький скрипт бэкапа с отправкой на почту
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «
#!/bin/sh
/usr/local/bin/mysqldump --opt -Aau Ваш пользователь -pВаш пароль > /var/tmp/all.sql
/usr/local/bin/rar a -ow -inul -pПарольНаАрхив /var/tmp/server_backup.rar /var/tmp/all.sql /etc /usr/local/etc /var/db/ports /var/db/pkg /usr/src/sys/i386/conf/KERNEL
/usr/bin/uuencode '/var/tmp/server_backup.rar' server_backup.rar | mail -s 'server backup' '
[email protected]'
rm /var/tmp/server_backup.rar
rm /var/tmp/all.sql
Автор: Pilson Sep 22 2012, 0:24
(Navern @ Sep 21 2012, 23:54)
Простенький скрипт бэкапа с отправкой на почту
Ну раз на то пошло - вот непростенький
Есть два конфига:
1. sys_backup.conf
по одному архиву в одну строку
имя архива, директория, кол-во хранимых бекапов, опции (nocompress или encrypt). Можно комментировать строки.
Пример:
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «
#Name Path archieves_to_store nocompress || encrypt
etc /etc/ 5 encrypt
sys_backup_scripts /opt/sys_backup/ 5 encrypt
www-dirs /var/www/ 3 encrypt
2. exclude.conf
содержит список всего что НЕ надо архивировать (исключения).
по одному файлу или вайлдкарду в строке
Пример:
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «
logs/*
log/*.txt
log-backup/*.bz2
log-old/*
*.tmp
tmp/*
Если директория - это например уже сжатые архивы, и их нужно просто перенести на бекап сервер - то используется параметр nocompress. Тогда скрипт просто копирует директорию на бекап сервер в таком виде в каком она есть. Если боитесь что по дороге до сервера трафик могут перехватить - ставите параметр encrypt. Используется асинхронное шифрование с помощью gpg через публичный ключ. Расшифровка только через приватный ключ. На данный момент реализовано использование либо шифрования, либо простого переноса директории. В будущем будет вдохновение или необходимость на работе - буду думать как использовать оба параметра одновременно.
Внутри скрипта указывается путь к рабочей директории, куда будут складываться бекапы, путь к конфигам, имя gpg ключа, URL бекап сервера (используется rsync), файл с паролем для бекап сервера (дабы не светить пароль в списке процессов).
Также скрипт умеет дампить mysql (можно отключить - on|off) каждую базу в отдельный файл, архивировать его на лету и шифровать, и лишь конечный результат уже пишется на диск. Т.е. перехватить промежуточный результат не получится. Пароль от mysql также не светится в списке процессов. Он сохранен в конфиге mysql сервера, и на конфиг выставляются владелец root:root и права 600, дабы никто кроме рута не имел к нему доступ.
пример:
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «
[client]
password = mypassword
Также скрипт устанавливает на свою рабочую директорию пользователя root:root и права 600, дабы никто кроме рута не мог туда добраться.
Некоторые моменты внутри мне очень не нравятся - хочется, можно и нужно сделать элегантней, но пока лениво, да и особо некогда.
Скрипт нужно запускаь от рута, и, например, через крон.
Теперь, собственно - сам скрипт:
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «
#!/bin/sh
export HOME="/root"
umask 0066
mysqlbackup="on"
rsync_user="$(hostname)"
url="rsync://${rsync_user}@backup_server/${rsync_user}"
workdir="/opt/sys_backup"
tmpdir="${workdir}/tmp"
conf="${workdir}/sys_backup.conf"
exclude="${workdir}/exclude.conf"
gpg_key="backup_public_key"
tstamp=`date +%Y-%m-%d`
backups_raw=$(awk '/^[\da-zA-Z]/' $conf)
rsync_pwfile="${workdir}/rsync.passwd"
if [ -z "$workdir" ]; then
echo "Error: working dir is not set."
exit 1
fi
if [ -z "$backups_raw" ]; then
echo "Error: config file is empty."
exit 1
fi
rm_old() {
if [ -z $3 ]; then
echo "Error: $1 $2 third parameter absent"
return 1
fi
wdir="$1"
name="$2"
max="$3"
total=$(ls -1 ${wdir}/${name}* | wc -l)
if [ $total -ge $max ]; then
olddir="$(pwd)"
cd $wdir
num=$(($total - $max))
[ $num -gt 0 ] && ls -1 ${name}* | sort | head -$num | xargs rm -f
fi
cd $olddir/
}
rsync_send() {
if [ -z $2 ]; then
echo "Error: $1 $2 second parameter absent"
return 1
fi
rsync -az --password-file=${rsync_pwfile} --delete $1 $2
}
arc() {
ext="tar.bz2"
if [ ! -z $3 ] && [ $3 = "encrypt" ]; then
tar --numeric-owner -X $exclude -cj $2 | gpg -e -r ${gpg_key} --yes -o ${1}.${ext}.gpg
else
tar --numeric-owner -X $exclude -cjf ${1}.$ext $2
fi
}
mkdir -p $tmpdir
chmod go-rwx $workdir
chmod go-rwx $workdir/*
for bname in $(echo "$backups_raw" | awk '/^[\da-zA-Z]/ {print $1}'); do
export bname
arc_dir="$(echo "$backups_raw" | awk '$1==ENVIRON["bname"] {print $2}')"
max="$(echo "$backups_raw" | awk '$1==ENVIRON["bname"] {print $3}' | egrep "^[0-9]+$")"
nocomp="$(echo "$backups_raw" | grep "^$bname" | grep "nocompress" -c)"
encr="$(echo "$backups_raw" | grep "^$bname" | grep "encrypt" -c)"
if [ "$nocomp" = "1" ]; then
rsync_send $arc_dir ${url}/${bname}/
else
if [ "$encr" = "1" ]; then
arc "${tmpdir}/$bname-$tstamp" "${arc_dir}/" encrypt
else
arc "${tmpdir}/$bname-$tstamp" "${arc_dir}/"
fi
if [ -n "$max" ]; then
rm_old $tmpdir $bname $max
else
echo "Error: $bname: third parameter must be a digit, skipping this part"
fi
fi
done
if [ $mysqlbackup = "on" ]; then
for mdump in $(echo "show databases;" | mysql -uroot | egrep -v "(^Database$|*_schema$|^test$|^ibdata$|^iblogs$)"); do #"
mysqldump --single-transaction --extended-insert --quick -R -u root -cB $mdump | bzip2 -z -9 | gpg -e -r ${gpg_key} --yes -o ${tmpdir}/mysql-${mdump}-${tstamp}.sql.bz2.gpg
rm_old $tmpdir mysql-$mdump 5
done
fi
cd $tmpdir
rsync_send ${tmpdir}/ ${url}/sys_backup/
Как создавать связку ключей - приватный и публичный - я тут не описывал. Также не описывал как сконфигурировать на сервере и запустить rsync в режиме демона.
Идеи по функционалу приветствуются
Автор: tischenkov Nov 21 2012, 20:25
Доброго дня.
Есть написанный скрипт для копирования информации с сайта и сохранения в файл .txt. в данном случае это копирование улиц киева. с сайта http://sezamka.kiev.ua/streets.htm
Написанный скрипт не переходит на следующую страницу.
Пожалуйста, подскажите, как правильно сделать. за ранее благодарен.
for count in seq 1 50; do links -dump "http://sezamka.kiev.ua/streets$count.htm" | grep район -A50 | tail -n10 >> addresses.txt; sleep 3;done
Автор: olexande Nov 23 2012, 10:28
Попробуйте добиться в ручном режиме "грабинга" любой 1 отдельной страницы.
Потом уже сможете запускать скрипт в цикле, обходя все страницы по очереди.
Автор: $w@mp Dec 20 2012, 19:50
Добрый день, кто подскажет - нужен скрипт, который будет запускатся кроном, скрипт должен пингануть какой-нибудь адрес в инете, и при отсутствии связи - ребутнуть роутер - к роутеру доступ есть по телнету
но линукс неполноценный - а бузибокс на арм-е, так что набор пакетов там ограничен - лучше всего стандартными пакетами обойтись.
Машина, на которой выполняется скрипт и роутер - разные устройства . До роутера можно достучатся только по телнету.
Автор: baltazor Dec 20 2012, 20:00
Что то типа:
ping -c2 x.x.x.x >/dev/null
if [ $? -eq 0 ]; then
echo "ok"
else
/sbin/reboot
fi
Автор: $w@mp Dec 20 2012, 20:22
(baltazor @ Dec 20 2012, 20:00)
Что то типа:
ping -c2 x.x.x.x >/dev/null
if [ $? -eq 0 ]; then
echo "ok"
else
/sbin/reboot
fi
Не подходит - машина, на которой выполняется скрипт и роутер - разные устройства . До роутера можно достучатся только по телнету.
Автор: Sintorres Dec 20 2012, 20:26
$w@mp,
Для виндов http://forum.0day.kiev.ua/index.php?s=&showtopic=71198&view=findpost&p=1637235
Автор: $w@mp Dec 20 2012, 20:32
(Sintorres @ Dec 20 2012, 20:26)
$w@mp,
Для виндов http://forum.0day.kiev.ua/index.php?s=&showtopic=71198&view=findpost&p=1637235
а для линукса?
Автор: Sintorres Dec 20 2012, 20:45
#!/usr/bin/expect
spawn $env(SHELL)
send -- "telnet 192.168.1.1 23\r"
expect -- "login"
send -- "root\r"
expect -- "Password: "
send -- "Admin\r"
expect -- "#"
send -- "kill -1 `cat /var/run/ppp0.pid`\r"
expect -- "#"
нарыл тут _ttp://www.beta.acorp.ru/forum/viewtopic.php?t=2123&postdays=0&postorder=asc&start=15
тут еще глянь.
http://forum.dlink.ru/viewtopic.php?f=6&t=139290
ПС у меня для виндов есть приблуда, которая пингует и ребутит adsl модем
Автор: Sintorres Dec 20 2012, 21:01
наверное http://anoxy.ru/%D0%9F%D0%B5%D1%80%D0%B5%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0-ADSL-%D0%BC%D0%BE%D0%B4%D0%B5%D0%BC%D0%B0-%D0%BF%D1%80%D0%B8-%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B5-%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD%D0%B0.html оно
Автор: $w@mp Dec 20 2012, 21:31
Спасибо за помощь - все работает
Автор: nerve Feb 1 2013, 12:10
как в одну строчку через пайп сделать svnadmin dump и tar так что бы сразу создавался архив дампа?
Автор: Sera Feb 13 2013, 20:28
Возможно немного с опозданием, но все таки отвечу на вопрос. Есть вот такие варианты решений:
svnadmin dump /var/lib/svn/repositories/repo_name | split -b 700m - .dump.tar.gz
где split -b 700m выпонит нарезку архивов размером по 700Мб
cat dump.tar.gz* | svnadmin load /var/lib/svn/repositories/repo_name
Вариант с gzip:
svnadmin dump /var/lib/svn/repositories/repo_name | gzip -9 > dump.gz
gunzip -c dump.gz | svnadmin load /var/lib/svn/repositories/repo_name
Автор: nerve Feb 14 2013, 9:40
да, с gzip вариант рабочий, а вот с первым я таки не понял
Автор: chagarna Feb 21 2013, 0:16
просьба помочь написать скриптик, последовательность такая:
1) монтируется винт с ext4
2) проходит 1 минута
3) создается папка например 19.03.2013 и в ней подпапки, например 1, 2, 3 и тд
4) с определённых папок копируются данные в эти папки 1 2 3 и тд
5) после окончания копирования проходит 1 минута
6) размонтируется винт
убунта сервак решил таким способом бекапить только тапками не кидайтесь, пытаюсь сам разобратся, но только пытаюсь..
Автор: nerve Mar 7 2013, 17:17
(Pilson @ Sep 22 2012, 0:24)
Идеи по функционалу приветствуются
не совсем в тему, но проблема такая:
1) работает, отправляет
NOW=`date +%d%m%y`
mysqldump -u root -p123 db > /root/backup/db.dump
tar czf /root/db$NOW.tar.gz -C /root/backup db.dump
mutt -s "mysql db for $NOW" -a /root/db$NOW.tar.gz --
[email protected] < /root/text.txt
2) работает, отправляет, но gmail не принимает
NOW=`date +%d-%m-%y`
rm -rf /root/backup/*.tar.gz.*
tar cz /etc/mail \
/etc/cron.d /etc/rc.d/init.d /etc/unicorn /etc/yum.repos.d \
/etc/httpd /etc/nginx /etc/sysconfig /etc/ssh \
/etc/fstab /etc/hosts ... | split -d -b 15M - /root/backup/host-$NOW.tar.gz.
mutt -s "host for $NOW part 1" -a /root/backup/host-$NOW.tar.gz.00 --
[email protected] < /root/text.txt
mutt -s "host for $NOW part 2" -a /root/backup/host-$NOW.tar.gz.01 --
[email protected] < /root/text.txt
2)если делать тоже самое с гзипом - то gmail принимает, но гзип следует по симлинкам в директориях, а это не подходит
gzip -cr /etc/mail \
/etc/cron.d /etc/rc.d/init.d /etc/unicorn /etc/yum.repos.d \
/etc/httpd /etc/nginx /etc/sysconfig /etc/ssh \
/etc/fstab /etc/hosts ... | split -d -b 15M - /root/backup/host-$NOW.gz.
mutt -s "host for $NOW part 1" -a /root/backup/host-$NOW.gz.00 --
[email protected] < /root/text.txt
не пойму, что ему не нравится в tar.gz разбитом сплитом..
хелп!
Автор: loky12 Mar 9 2013, 16:57
(nerve @ Mar 7 2013, 17:17)
не пойму, что ему не нравится в tar.gz разбитом сплитом..
хелп!
Насколько помню gmail'у не нравится много расширений попробуйте не дописывать tar.
Автор: nerve Mar 11 2013, 9:27
Yo! чувак, ты гений!!
поменял host-$NOW.tar.gz. на host-$NOW.
и все отправилось/принялось сразу)
Автор: baltazor Mar 27 2013, 20:13
(santer @ Mar 27 2013, 14:03)
Вопрос от новичка
Скрипт запускается каждый час
Например запустился он в 25.03.2013 15:00, нужно что бы он выполнил запрос на получения данных с бд за период времени 25.03.2013 14:00 - 15:00 . Если запустился в 16:00 то выбрать 15:00-16:00 и т.д
Каким способом возможно доставать время из системы и дальше передать в переменную ?
Зарание благодарен
date +%k-%M - текущее время на сервере
Час назад:
date -d '1 hour ago' +%k
Автор: artem.ultra Sep 10 2013, 15:40
помогите сделать скрипт
есть два текстовых файла 1.txt и 2.txt
надо провести анализ содержимого двух файлов и если есть одинаковые данные во втором файле, то удалить их в первом.
в файлах мейлы клиентов, каждый мейл с новой строки
в первом файлы вся база мейлов, во втором не рабочие мейлы
Автор: Dieselist Sep 10 2013, 16:11
(artem.ultra @ Sep 10 2013, 16:40)
помогите сделать скрипт
есть два текстовых файла 1.txt и 2.txt
надо провести анализ содержимого двух файлов и если есть одинаковые данные во втором файле, то удалить их в первом.
в файлах мейлы клиентов, каждый мейл с новой строки
в первом файлы вся база мейлов, во втором не рабочие мейлы
например так:
$ cat mail_cleaner.sh
#!/bin/bash
sort $1 > /tmp/wholebase.lst
sort $2 > /tmp/addresses_to_remove.lst
for mail in `comm /tmp/wholebase.lst /tmp/addresses_to_remove.lst -12`
do
echo "address to remove: $mail"
sed -i "/$mail/d" $1
done
первым аргументом скрипту скармливаем первый файл (полную базу), вторым - базу с не рабочими мейлами
Автор: Pilson Sep 10 2013, 17:28
(Dieselist @ Sep 10 2013, 17:11)
например так:
первым аргументом скрипту скармливаем первый файл (полную базу), вторым - базу с не рабочими мейлами
Чего уж тогда просто не читать второй файл построчно и скармливать sed`у эти строки? Найдет совпадение - удалит.
Или для каждой строки из второго файла создать правило для sed, через точку с запятой, и не отдать в конце его sed`у.
И кстати, правильней будет указывать так:
sed -i "/^$mail/d" $1
т.е. поиск строго с начала строки.
Иначе возможен вариант когда во втором файле будет например
[email protected], а в первом -
[email protected], и строка удалится, т.к. проверка была не строгая.
Автор: Dieselist Sep 10 2013, 17:48
(Pilson @ Sep 10 2013, 18:28)
Чего уж тогда просто не читать второй файл построчно и скармливать sed`у эти строки? Найдет совпадение - удалит. Или для каждой строки из второго файла создать правило для sed, через точку с запятой, и не отдать в конце его sed`у.
первое что пришло в голову
(Pilson @ Sep 10 2013, 18:28)
И кстати, правильней будет указывать так:
sed -i "/^$mail/d" $1
т.е. поиск строго с начала строки.
Иначе возможен вариант когда во втором файле будет например
[email protected], а в первом -
[email protected], и строка удалится, т.к. проверка была не строгая.
согласен
только если уж пошла такая жара - надо так:
sed -i "/^$mail$/d" $1
а то вдруг у нас есть и
[email protected] и
[email protected]
Автор: artem.ultra Sep 10 2013, 20:12
ох ребята вас понесло)))
спасибо!
завтра утрячком попробую)
Автор: artem.ultra Sep 10 2013, 21:47
уже пробую!
cat cleaner_mail.sh
#!/bin/bash
sort $1 > /root/1.txt
sort $2 > /root/2.txt
for mail in `comm /root/1.txt /root/2.txt -12`
do
echo "address to remove: $mail"
sed -i "/^$mail$/d" $1
файлик /root/1.txt становится пустым
в консоли скрипт не заканчивается приходиться ложить его руками
Автор: Dieselist Sep 10 2013, 21:56
(artem.ultra @ Sep 10 2013, 22:47)
уже пробую!
cat cleaner_mail.sh
#!/bin/bash
sort $1 > /root/1.txt
sort $2 > /root/2.txt
for mail in `comm /root/1.txt /root/2.txt -12`
do
echo "address to remove: $mail"
sed -i "/^$mail$/d" $1
файлик /root/1.txt становится пустым
в консоли скрипт не заканчивается приходиться ложить его руками
Потому что сам скрипт править не надо было. Оставь скрипт как есть в моем варианте (разве что с правкой предложенной товарщем Pilson, если мейлы и правда могут так совпадать), и вызови скрипт из консоли таким образом:
# cleaner_mail.sh /root/1.txt /root/2.txt
Если что по прежнему непонятно/ не работает - пиши в ПМ, чтоб не засорять тему.
Автор: Freestyler Sep 11 2013, 9:14
Зачем для такой простой задачи скрипт?
grep -iv -f 2.txt 1.txt > out.txt
файл out.txt будет содержать вычтенную информацию с файла 1.txt по списку в файле 2.txt
Автор: nerve Sep 11 2013, 16:53
Автор: Dieselist Sep 11 2013, 17:14
(nerve @ Sep 11 2013, 17:53)
$ grep -ivw -f mail2.txt mail1.txt
[email protected][email protected]
Автор: nerve Sep 23 2013, 10:03
Функция spentdaily должна выполняться с вторника по субботу, а функция spentweekly только в понедельник. правильно ли я написал условие проверки?
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «
#!/bin/bash
CURDAY=`date +"%A"`
MOND=Monday
SUN=Sunday
spentdaily () {
..
some code
..
}
spentweekly () {
..
some code
..
}
if [ $CURDAY = $MOND ];
then
spentweekly
elif [ $CURDAY != $MOND -o $CURDAY != $SUN ];
then
spentdaily
fi
exit 0
Автор: Dieselist Dec 31 2013, 16:30
(nerve @ Sep 23 2013, 10:03)
Функция spentdaily должна выполняться с вторника по субботу, а функция spentweekly только в понедельник. правильно ли я написал условие проверки?
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «
#!/bin/bash
CURDAY=`date +"%A"`
MOND=Monday
SUN=Sunday
spentdaily () {
..
some code
..
}
spentweekly () {
..
some code
..
}
if [ $CURDAY = $MOND ];
then
spentweekly
elif [ $CURDAY != $MOND -o $CURDAY != $SUN ];
then
spentdaily
fi
exit 0
Не лучше ли так?
DATE=$(date +%u)
case $DATE in
[1]) spentweekly;;
[2-6]) spentdaily;;
esac
Автор: fli Aug 18 2014, 20:01
Задача: засинкать директорию, удалив содержимое source dir.
rsync -av --remove-source-files src/ dest/
Но при этом зашифровать все файлы gpg.
Подскажите, в каком направлении двигаться?
UPD. Подсказали:
find src/ -type f -exec gpg .... {} \;
find src/ -type f ! -name '*.gpg' -exec rm {} \;
Автор: Pilson Aug 18 2014, 20:07
(fli @ Aug 18 2014, 21:01)
Задача: засинкать директорию, удалив содержимое source dir.
rsync -av --remove-source-files src/ dest/
Но при этом зашифровать все файлы gpg.
Подскажите, в каком направлении двигаться?
Эммм... Зашифровать потом перенести/удалить?
Автор: artem.ultra Sep 30 2014, 11:50
пильнул скрипт если можно так назвать))
#!/bin/bash
virsh shutdown vm_id && cp /home/vm-pool/vm_id.img /home/vm_id.img-`date +%d-%B-%Y` && virsh start vm_id
и вот нужно сделать паузу после virsh shutdown vm_id, 40сек и после virsh start vm_id отправить мейл, о том что копирование завершено.
подскажет кто?
Автор: mak_v_ Sep 30 2014, 15:01
(artem.ultra @ Sep 30 2014, 12:50)
пильнул скрипт
если можно так назвать))
#!/bin/bash
virsh shutdown vm_id && cp /home/vm-pool/vm_id.img /home/vm_id.img-`date +%d-%B-%Y` && virsh start vm_id
и вот нужно сделать паузу после virsh shutdown vm_id, 40сек и после virsh start vm_id отправить мейл, о том что копирование завершено.
подскажет кто?
&& sleep 40 && mail -s "что копирование завершено"
[email protected]
Автор: santer Sep 30 2014, 15:14
(artem.ultra @ Sep 30 2014, 12:50)
пильнул скрипт
если можно так назвать))
#!/bin/bash
virsh shutdown vm_id && cp /home/vm-pool/vm_id.img /home/vm_id.img-`date +%d-%B-%Y` && virsh start vm_id
и вот нужно сделать паузу после virsh shutdown vm_id, 40сек и после virsh start vm_id отправить мейл, о том что копирование завершено.
подскажет кто?
#!/bin/bash
SUBJECT = " "
EMAIL = " "
EMAILMESSAGE = "/tmp/emailmessage.txt"
echo "текст" >> $EMAILMESSAGE
virsh shutdown vm_id && cp /home/vm-pool/vm_id.img /home/vm_id.img-`date +%d-%B-%Y` && sleep 40 &&
virsh start vm_id && /bin/mail -s "$SUBJECT" "$EMAIL" < $EMAILMESSAGE
http://postfix.state-of-mind.de/patrick.koetter/smtpauth/postfix_configuration.html - Как настроить отправку почту через смтп. Это нужно для работы mail -s
https://rtcamp.com/tutorials/linux/ubuntu-postfix-gmail-smtp/ гугловский смтп
Автор: mak_v_ Sep 30 2014, 16:09
santer, мне бы пременных побольше, побольше....
Автор: santer Sep 30 2014, 16:44
(mak_v_ @ Sep 30 2014, 17:09)
santer, мне бы пременных побольше, побольше....
Простите, это просто было под рукой
echo "This is the message body" | mail -s "This is the subject" mail@mail
Автор: Fill Oct 1 2014, 1:50
Подскажите пжлст.
Есть конструкция вида
... some code was here...
check_proc() {
pgrep -u $USER -f $PGREP_STRING >/dev/null
}
killproc() {
pkill -u $USER -f $PGREP_STRING
}
check_proc
if [ $? -eq 0 ]; then
echo "$NAME launched, killing process. Wait a bit..."
killproc
until [ $? -ne 0 ]; do
sleep 1
echo "Rechecking..."
check_proc
done
check_proc
if [ $? -eq 0 ]; then
log_failure_msg "Error stopping $NAME."
exit -1
else
log_success_msg "Stopped $NAME."
fi
else
log_failure_msg "$NAME is not running or you don't have permission to stop it"
fi
Нужно после, например, сотой итерации until валить скрипт с ошибкой или пользовать pkill -9 java.
Как добавить?
Автор: mak_v_ Oct 1 2014, 9:42
(Fill @ Oct 1 2014, 2:50)
Нужно после, например, сотой итерации until валить скрипт с ошибкой или пользовать pkill -9 java.
Как добавить?
Вставить в конец цикла счетчик
Автор: protrue Oct 1 2014, 9:49
(Fill @ Oct 1 2014, 1:50)
Подскажите пжлст.
Стандартная конструкция с инит скрипта для SQUID:
SQUID_PIDFILE_TIMEOUT=${SQUID_PIDFILE_TIMEOUT:-20}
SQUID_SHUTDOWN_TIMEOUT=${SQUID_SHUTDOWN_TIMEOUT:-100}
start() {
# Check if $SQUID_PIDFILE_DIR exists and if not, lets create it and give squid permissions.
if [ ! -d $SQUID_PIDFILE_DIR ]; then mkdir $SQUID_PIDFILE_DIR; chown -R $SQUID_USER.$SQUID_DIR $SQUID_PIDFILE_DIR; fi
probe
parse=`$SQUID -k parse -f $SQUID_CONF 2>&1`
RETVAL=$?
if [ $RETVAL -ne 0 ]; then
echo -n $"Starting $prog: "
echo_failure
echo
echo "$parse"
return 1
fi
for adir in $CACHE_SWAP; do
if [ ! -d $adir/00 ]; then
echo -n "init_cache_dir $adir... "
$SQUID -z -F -f $SQUID_CONF >> /var/log/squid/squid.out 2>&1
fi
done
echo -n $"Starting $prog: "
$SQUID $SQUID_OPTS -f $SQUID_CONF >> /var/log/squid/squid.out 2>&1
RETVAL=$?
if [ $RETVAL -eq 0 ]; then
timeout=0;
while :; do
[ ! -f /var/run/squid.pid ] || break
if [ $timeout -ge $SQUID_PIDFILE_TIMEOUT ]; then
RETVAL=1
break
fi
sleep 1 && echo -n "."
timeout=$((timeout+1))
done
fi
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$SQUID
[ $RETVAL -eq 0 ] && echo_success
[ $RETVAL -ne 0 ] && echo_failure
echo
return $RETVAL
}
stop() {
echo -n $"Stopping $prog: "
$SQUID -k check -f $SQUID_CONF >> /var/log/squid/squid.out 2>&1
RETVAL=$?
if [ $RETVAL -eq 0 ]; then
$SQUID -k shutdown -f $SQUID_CONF &
rm -f /var/lock/subsys/$SQUID
timeout=0
while :; do
[ -f /var/run/squid.pid ] || break
if [ $timeout -ge $SQUID_SHUTDOWN_TIMEOUT ]; then
echo
return 1
fi
sleep 2 && echo -n "."
timeout=$((timeout+2))
done
echo_success
echo
else
echo_failure
if [ ! -e /var/lock/subsys/$SQUID ]; then
RETVAL=0
fi
echo
fi
rm -rf $SQUID_PIDFILE_DIR/*
return $RETVAL
}
(artem.ultra @ Sep 30 2014, 11:50)
пильнул скрипт
если можно так назвать))
#!/bin/bash
virsh shutdown vm_id && cp /home/vm-pool/vm_id.img /home/vm_id.img-`date +%d-%B-%Y` && virsh start vm_id
и вот нужно сделать паузу после virsh shutdown vm_id, 40сек и после virsh start vm_id отправить мейл, о том что копирование завершено.
подскажет кто?
Если не настраивать релей локально то можно почитать о .msmtprc .muttrc
Автор: Fill Oct 1 2014, 14:06
protrue, это я понимаю. Не могу врубиться, как в цикл until всунуть две переменные, чтоб цикл вертелся, пока первая не true. Если сунуть что-то типа until : ; то из цикла вылетит сразу.
Автор: Pilson Oct 1 2014, 14:32
(Fill @ Oct 1 2014, 15:06)
protrue, это я понимаю. Не могу врубиться, как в цикл until всунуть две переменные, чтоб цикл вертелся, пока первая не true. Если сунуть что-то типа until : ; то из цикла вылетит сразу.
Зачем until для этого?
kill -15 PID
sleep 10
kill -9 PID
по-русски:
послали процессу стандартный сигнал завершения.
подождали 10 секунд
прибили процесс жестко.
Автор: Fill Oct 1 2014, 14:50
Pilson, затем, что инит-скрипт для кучи разных java-процессов и все ведут себя по-разному + там еще есть кусок кода, который срет в почту при ошибке.
Автор: Pilson Oct 1 2014, 15:13
Так может стоит каждый процесс разнести по своим скриптам?
Автор: Fill Oct 1 2014, 15:30
Pilson, не получится в силу определенных ограничений.
PID не используется, используется pkill $PROCESS_NAME
Пока пробую обойтись конструкцией вида
(( count = 5 ))
while [[ $count -ne 0 ]]; do
echo "Rechecking... $count tries left"
check_proc
if [[ $? -eq 0 ]]; then
(( count = 1 ))
echo "Failed to stop gracefully, killing process..."
pkill -9 -u $USER -f $PGREP_STRING
fi
(( count = $count - 1 ))
echo "$? $count"
sleep 1
Еще причёсываю.
Автор: Fill Oct 1 2014, 17:35
Причесал
(( count = 60 ))
# Make sure it's dead before we return
until [ $kill -ne 0 ]; do
sleep 1
echo "$count tries left before comfirmed kill, rechecking..."
check_proc
kill=$?
if [[ $count -eq 0 ]]; then
echo "Failed to stop $NAME gracefully, trying to kill it with fire..."
pkill -9 -u $USER -f $PGREP_STRING
rm -f $HOME/RUNNING_PID
exit 0
fi
(( count = $count - 1 ))
done
Автор: Fill Oct 1 2014, 18:43
Еще задачка, но извратная.
Нужен интерактивный запрос параметра (читай - пароля) на выполнение скрипта. Если значение параметра в скрипт не передается - он валится с ошибкой. Если значение передается неправильное - скрипт валится. Если передается правильное значение - оно сверяется с hardcoded и продолжает скрипт.
Цель - запретить запуск скрипта для всех, кроме тех, кто знает значение параметра.
Варианты с делегированием прав не рассматриваются вообще.
Автор: Pilson Oct 2 2014, 12:34
(Fill @ Oct 1 2014, 19:43)
Еще задачка, но извратная.
Нужен интерактивный запрос параметра (читай - пароля) на выполнение скрипта.
echo -n "Ты кто такой? "
read item
case "$item" in
babaka) echo "Превед, продолжаем..."
;;
*) echo "Давай досвидания..."
exit 10
;;
esac
echo "Продолжение."
Только вот мне кажется, что если пользователь может скрипт запустить, то может его и просмотреть.
А вот если сделать это через подсчет любого хеша, например md5, то узнать правильный пароль можно только брутфорсом.
Пример (пароль тот же - babaka):
echo -n "Ты кто такой? "
read item
if [ $(echo -n $item | md5sum | sed 's/\s.*//g') != "500063f4fd2c78cbcfc34f39a66e7273" ]; then
echo "Давай досвидания..."
exit 10
fi
echo "Превед."
Автор: Fill Oct 2 2014, 12:49
Pilson, я думал через сравнение сделать [ $a -eq $b ], где $a берется из консоли, а $b запрятать поглубже.
Нужна просто защита от дурака, чтоб случайно не натравили скрипт на продакшн.
Автор: Pilson Oct 2 2014, 12:59
(Fill @ Oct 2 2014, 13:49)
Pilson, я думал через сравнение сделать [ $a -eq $b ], где $a берется из консоли, а $b запрятать поглубже.
Нужна просто защита от дурака, чтоб случайно не натравили скрипт на продакшн.
А чем тебя md5sum не устраивает в качестве спрятать поглубже?
Впрочем что первый вариант, что второй, делают по факту одно и то же - сравнивают что-то с чем-то.
Если уж совсем хочется тупо а = б - на:
echo -n "Ты кто такой? "
read a
b="babaka"
if [ $a != $b ]; then
echo "Давай досвидания..."
exit 10
fi
echo "Превед."
Автор: Fill Oct 2 2014, 13:01
Pilson, устраинвает, пасиба, но это слишком далеко Все равно будет видно введенный параметр, даже если его захэшировать.
Автор: nerve Jan 14 2015, 17:13
на работе поставили точку доступа Интертелеком.
на случай падения основного канала есть маленький скриптик, который сидит в кроне и каждые 5 минут проверяет.
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «
#!/bin/sh
def_gw="x.x.x.x"
back_gw="y.y.y.y"
current_gw=$(netstat -rn | head -5 | tail -1 | awk '{print $2}')
change () {
route change default $1
}
check () {
if ping -q -c 3 8.8.8.8 > /dev/null; then
echo "Default GW and Internet is OK"
exit 0
else
echo "Some problem with Default connection"
change $backup_gw
fi
}
case $current_gw in
$default_gw) check
;;
$backup_gw) change $default_gw; check
;;
esac
Автор: sahasaha Jun 2 2015, 14:39
Помогите написать скрипт для удаления из базы данных строки, и последующей перегрузкой.
Грубо говоря идея такова
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «
<?php
$db = 'sqlite:/var/basa.db';
$query = $db->exec('DELETE FROM employ where ID = 1 ');
sysCmd(" sudo reboot")
>
Только не пойму сработает ли, если по ID не будет ничего.
ЗЫ. И как лучше, так, или всё-так запихнуть в sh
Автор: lega150493 Jun 4 2015, 13:26
Привет всем. Может кто еще в хостинг компании работает.
Скрипт поиска спамеров на cPanel:
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «
sudo cat /var/log/exim_mainlog | grep "`date '+%Y-%m-%d'`" | grep "<=" | grep -v "U=mailnull" | grep -v "T=\"Cron" | grep -v "U=root" | grep -v "<>" | grep "U=" | awk -F 'U=' '{print $2}' | awk '{print $1}' | sort | uniq -c | sort
Автор: Pilson Jun 4 2015, 23:59
То же самое, но короче и менее прожорливей:
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «
sudo cat /var/log/exim_mainlog | grep "`date '+%Y-%m-%d'`" | grep "<=" | egrep -v "(U=mailnull|T=\"Cron|U=root|<>" | awk -F 'U=' '/U=/ {print $2}' | awk '{print $1}' | sort | uniq -c | sort
Автор: artem.ultra Dec 12 2016, 13:35
товарищи! выручайте
есть такое вот:
iostat -d | awk '{print $1}' | sed -e '/^\([hsv]d[a-z]\)$/!d'
с выводом:
sda
и вот так: iostat -d | awk '{print $1}'
Linux
Device:
sda
нужно запилить на одном сервере, но там хранилище немного другое (hp)
iostat -d | awk '{print $1}'
Linux
Device:
cciss/c0d0
cciss/c1d0
собственно iostat -d | awk '{print $1}' | sed -e '/^\([hsv]d[a-z]\)$/!d' дает пустой вывод
помогите плз
Автор: Koka-ftp Dec 12 2016, 14:22
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «
(artem.ultra @ Dec 12 2016, 13:35)
товарищи! выручайте
есть такое вот:
iostat -d | awk '{print $1}' | sed -e '/^\([hsv]d[a-z]\)$/!d'
с выводом:
sda
и вот так: iostat -d | awk '{print $1}'
Linux
Device:
sda
нужно запилить на одном сервере, но там хранилище немного другое (hp)
iostat -d | awk '{print $1}'
Linux
Device:
cciss/c0d0
cciss/c1d0
собственно iostat -d | awk '{print $1}' | sed -e '/^\([hsv]d[a-z]\)$/!d' дает пустой вывод
помогите плз
как-то так
iostat -d | awk '{print $1}' | grep cciss | sed -e 's/cciss\///'
или так)
iostat -d | awk '/cciss/ {print $1}' | sed -e 's/cciss\///'
Автор: artem.ultra Dec 12 2016, 14:25
Koka-ftp
поехало! пасиб!
Автор: nerve Dec 19 2016, 13:28
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «
#!/bin/sh
one="1 2 3"
two="4 5 6"
three="one two"
for i in $three; do
echo $i; echo ++
for j in $i; do
echo $j; echo ==
done
done
output
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «
desired output
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «
ps. maybe fixed
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «
one="1 2 3"
two="4 5 6"
three="one two"
for i in $three; do
echo $i;
eval y="$"$i
for j in $y; do
echo $j;
done
done
Автор: xfiles May 24 2019, 16:45
Проверяем корректно ли работает домен. Чекаем serial, ptr, dns propagation, status, current ns, ttl сразу одним махом. Когда работаешь в хостинге, и каждый день проверять по 1-20 доменов, скрипт сильно оптимизирует рабочее время.
Скрин:
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «
Скрипт:
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «
#!/bin/bash
if [ -z $1 ]; then
echo -e "Usage:\n\t$0 <domain>\n\t <ip>"
exit 0
else
domain=$1
fi
pattern=( "[nN]server:" "Name Server:" "\[Name Server\]" "nameservers:" ) # угадываем как записаны NS в whois-треше
HOST_WAIT="2" # timeout in sec
: ${WHOIS="/usr/bin/whois"}
CL_dark="\e[38;5;242m"
CL_ok="\e[38;5;2m"
CL_clientTransferProhibited="\e[38;5;13m"
CL_linked="\e[38;5;64m"
CL_epp_codes="\e[38;5;117m"
CL_orange="\e[38;5;166m"
CL_mnt="\e[38;5;31m"
CL_status="\e[38;5;30m"
CL_ptr="\e[38;5;26m"
CL_down="\e[38;5;124m"
CL_bad_ptr="\e[38;5;125m"
CL_good_ptr="\e[38;5;11m"
CL_arec="\e[38;5;26m"
CL_txt="\e[38;5;241m"
CL_hold="\e[38;5;124m"
CL_close="\e[0m"
valid_ip () {
local ip=$1
local stat=1
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
IFS='.'; ip=($ip); unset IFS
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
stat=$?
fi
return $stat
}
bl_ch () {
local ip="$1"
echo -e "\n ${CL_txt} Blacklist check: ${CL_close}"
BLISTS="
dnsbl.httpbl.org
cbl.abuseat.org
dnsbl.sorbs.net
bl.spamcop.net
zen.spamhaus.org
combined.njabl.org
"
# register at http://www.projecthoneypot.org/httpbl_api.php to
# obtain an API-key
HTTPbl_API_KEY="[api_key]"
ERROR() {
echo $0 ERROR: $ip >&2
exit 2
}
[ $# -ne 1 ] && ERROR 'Please specify a single IP address'
reverse=$( echo "${ip}" | sed -r 's/^([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})$/\4.\3.\2.\1/g' )
if [ "x${reverse}" = "x" ] ; then
ERROR "IMHO '$ip' doesn't look like a valid IP address"
exit 1
fi
for BL in ${BLISTS} ; do
if [ "$BL" == "dnsbl.httpbl.org" ]; then
LISTED="$( dig +short -t a ${HTTPbl_API_KEY}.${reverse}.${BL}. )"
printf "${CL_mnt}${HTTPbl_API_KEY}.${CL_txt}%-40s${CL_dark}%-20s${CL_close}\n" "${reverse}.${BL}." ${LISTED:----}
else
LISTED="$( dig +short -t a ${reverse}.${BL}. )"
printf "${CL_txt}%-50s${CL_dark}%-20s${CL_close}\n" ${reverse}.${BL}. ${LISTED:----}
fi
done
}
get_arpa () {
if valid_ip ${domain}; then
echo -e "${CL_txt} NS's \t\t [ PTR ] ${CL_close}"
NS=( $( V="$(host -W $HOST_WAIT -a ${domain}
if [ $? -eq 1 ]; then
echo -e "${CL_txt}> ${CL_down}NXDOMAIN ${CL_close}" 1>&2
fi
)"
V_FILTERED="$(echo "${V}" | grep "IN.*NS" | awk '{print $5}')"
if [ -z "${V_FILTERED}" ]; then
echo -e "${CL_txt}> ${CL_orange}no NS ${CL_close}" 1>&2
fi
echo "${V_FILTERED}"
)
)
for ns in ${NS[@]}; do
recPTR="$( host -W $HOST_WAIT -tPTR "${domain}" "${ns}" 2>/dev/null | awk -F"name pointer" '{print $2}' | grep . | tr -d " " | tr "\n" " " )"
printf "${CL_orange}%-30s${CL_PTR}%-35s${CL_close}\n" "${ns}" "${recPTR}"
done
RET=0
fi
return ${RET:-1}
}
get_whois () {
# ищем в whois нужное, и пишем это в переменные
WHOIS_V=$( ${WHOIS} ${domain:-NONEXISTSDOMAIN.COM} )
for p in "${pattern[@]}"; do
NS=( $(echo "${WHOIS_V}" | grep "${p}" | \
sed "s/$p//" | \
awk '{print $1}' | \
tr "[A-Z]" "[a-z]" | \
sort | uniq
)
)
[[ ! -z "${NS}" ]] && break # если по паттерну нашли строку с NS, дальше не грепаем
done
[[ ${#NS[@]} -eq 0 ]] && { echo -e "${CL_down}${WHOIS_V}\n${CL_close}"; exit 0; } # если, по паттерну, ничего не нашли
mntby=$( echo "${WHOIS_V}" | grep -i "mnt-by:" | head -n1 | tr -s ' ' )
# https://www.icann.org/resources/pages/epp-status-codes-2014-06-16-en
status=( $( echo "${WHOIS_V}" | \
grep -iEo "status:.*" | \
sed 's/[Ss]tatus://' | \
sed 's/http[^ ]*//g' | \
tr -d " " | \
sed "s|linked|\\${CL_linked}linked\\${CL_close}| ; \
s|addPeriod|\\${CL_epp_codes}addPeriod\\${CL_close}| ; \
s|autoRenewPeriod|\\${CL_epp_codes}autoRenewPeriod\\${CL_close}| ; \
s|inactive|\\${CL_epp_codes}inactive\\${CL_close}| ; \
s|[oO][kK]|\\${CL_ok}ok\\${CL_close}| ; \
s|pendingCreate|\\${CL_epp_codes}pendingCreate\\${CL_close}| ; \
s|pendingDelete|\\${CL_epp_codes}pendingDelete\\${CL_close}| ; \
s|pendingRenew|\\${CL_epp_codes}pendingRenew\\${CL_close}| ; \
s|pendingRestore|\\${CL_epp_codes}pendingRestore\\${CL_close}| ; \
s|pendingTransfer|\\${CL_epp_codes}pendingTransfer\\${CL_close}| ; \
s|pendingUpdate|\\${CL_epp_codes}pendingUpdate\\${CL_close}| ; \
s|redemptionPeriod|\\${CL_epp_codes}redemptionPeriod\\${CL_close}| ; \
s|renewPeriod|\\${CL_epp_codes}renewPeriod\\${CL_close}| ; \
s|serverDeleteProhibited|\\${CL_epp_codes}serverDeleteProhibited\\${CL_close}| ; \
s|serverHold|\\${CL_epp_codes}serverHold\\${CL_close}| ; \
s|serverRenewProhibited|\\${CL_epp_codes}serverRenewProhibited\\${CL_close}| ; \
s|serverTransferProhibited|\\${CL_epp_codes}serverTransferProhibited\\${CL_close}| ; \
s|serverUpdateProhibited|\\${CL_epp_codes}serverUpdateProhibited\\${CL_close}| ; \
s|transferPeriod|\\${CL_epp_codes}transferPeriod\\${CL_close}| ; \
s|clientDeleteProhibited|\\${CL_epp_codes}clientDeleteProhibited\\${CL_close}| ; \
s|clientHold|\\${CL_hold}clientHold\\${CL_close}| ; \
s|clientRenewProhibited|\\${CL_epp_codes}clientRenewProhibited\\${CL_close}| ; \
s|clientTransferProhibited|\\${CL_clientTransferProhibited}clientTransferProhibited\\${CL_close}| ; \
s|clientUpdateProhibited|\\${CL_epp_codes}clientUpdateProhibited\\${CL_close}|
"
)
)
# Итого, вынесли с whois переменные $mntby $status ${NS[]}
}
print_line () {
local i=$1
# для первой строки, свой принт
if [ $i -eq 0 ]; then
printf "${CL_orange}%-30s${CL_recAs}%-16s${CL_PTR}%-35s${CL_rDNS_CHK}%-8s${CL_dark}%-20s${CL_close}\n" "${ns}" "${recAs}" "${PTR}" "${rDNS_CHK}" "${rDNS_CHK_TXT}"
else
printf " ${CL_recAs}%-16s${CL_PTR}%-35s${CL_rDNS_CHK}%-8s${CL_dark}%-20s${CL_close}\n" "${recAs}" "${PTR}" "${rDNS_CHK}" "${rDNS_CHK_TXT}"
fi
}
get_ns () {
local NStype=$1
case ${NStype} in
auth)
:
NS_save_auth=( "${NS[@]}" )
;;
locall)
NS=()
NS=( $(cat /etc/resolv.conf | grep nameserver | grep -oE "[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}" ) )
NS_save_locall=( "${NS[@]}" )
;;
public)
NS=()
NS=( 8.8.8.8 8.8.4.4 1.1.1.1 9.9.9.9 5.1.2.1 5.1.2.2)
NS_save_public=( "${NS[@]}" )
;;
*)
NS=()
echo "bad NS type"
exit 0
;;
esac
local ns_seq=0
for ns in ${NS[@]}; do
# flush var's
recAs=""
PTR=""
rDNS_CHK=""
rDNS_CHK_TXT=""
CL_PTR=""
CL_recAs=""
CL_rDNS_CHK=""
serial=""
# строим список А-записей одной строкой через пробелы
recA="$( host -W $HOST_WAIT -tA "${domain}" "${ns}" 2>/dev/null | awk -F"has address" '{print $2}' | grep . | tr -d " " | tr "\n" " " )"
#echo "a:${recA}:"
# для функции print_line
local i=0
if [[ -z "${recA}" ]]; then
recAs="-"
PTR="-"
rDNS_CHK="-"
CL_PTR="${CL_dark}"
CL_recAs="${CL_dark}"
CL_rDNS_CHK="${CL_dark}"
print_line $i
else
CL_recAs="${CL_arec}"
for recAs in ${recA}; do
PTR="$( host -W $HOST_WAIT "${recAs}" "${ns}" 2>/dev/null | grep -v "not found:" | awk -F"name pointer" '{print $2}' | grep . | tr "\n" " " | tr -d " " )"
#echo "ptr:${PTR}:"
if [[ -z "${PTR}" ]]; then
PTR="-"
#LN_PTR="17"
CL_PTR="${CL_dark}"
rDNS_CHK="-"
rDNS_CHK_TXT=""
CL_rDNS_CHK="${CL_dark}"
else
CL_PTR="${CL_ptr}"
#LN_PTR=$(( ${#PTR} +8 ))
rDNS="$( host -W $HOST_WAIT "${PTR}" "${ns}" 2>/dev/null | grep -v "not found:" | awk -F"has address" '{print $2}' | grep . | tr -d " " | tr "\n" " " )"
#echo "rdns:${rDNS}:"
# сверяем А-запись и резолв PTR
if [[ "${rDNS}" == *${recAs}* ]]; then
rDNS_CHK="[ GOOD ]"
rDNS_CHK_TXT=""
CL_rDNS_CHK="${CL_good_ptr}"
else
rDNS_CHK="[ BAD ]"
rDNS_CHK_TXT="${rDNS:-NULL}"
CL_rDNS_CHK="${CL_bad_ptr}"
fi
fi
print_line $i
(( i++ ))
done
fi
# достаем с текущего ${ns} сериал для домена ${domain}
local SOA="$( host -W $HOST_WAIT -tSOA "${domain}" "${ns}" 2>/dev/null | awk -F"has SOA record" '{print $2}' | grep . )"
local SOAmaster="$( echo "${SOA}" | awk '{print $1}' )"
local SOAserial="$( echo "${SOA}" | awk '{print $3}' | grep -Eo "[0-9]{10}" | tr -d " " )"
local SOAttl="$( echo "${SOA}" | awk '{$1=$2=$3="";print}' )"
case ${NStype} in
auth) recS_auth[$ns_seq]="${SOAserial}"
recS_auth_master[$ns_seq]="${SOAmaster}"
recS_auth_ttl[$ns_seq]="${SOAttl}"
;;
locall) recS_locall[$ns_seq]="${SOAserial}"
;;
public) recS_public[$ns_seq]="${SOAserial}"
;;
esac
(( ns_seq++ ))
done
}
serial_check_auth () {
master_ok=0
# совпадает ли мастер сервер в ответах от авторитативных серверов
find_master=( $( echo "${recS_auth_master[@]}" | tr " " "\n" | sort | uniq | grep . ) )
if [ ! ${#find_master[@]} -eq 1 ]; then
echo -e "\t ${CL_down}SOA master mismatch in Authoritative DNS: ${find_master[@]:-"N/A"}${CL_close}"
else
# for start print_timers()
master_ok=1
#
echo -e "\t ${CL_txt}Find master: ${CL_ok}${find_master}${CL_close}"
# определить кто из авторитативных есть мастер; нужно ли ?
#try_resolve="$( host -W $HOST_WAIT -tA "${find_master}" "${find_master}" 2>/dev/null | grep -v "not found:" | awk -F"has address" '{print $2}' | grep . | tr -d " " | tr "\n" " " )"
# совпадает ли сериал в ответах от авторитативных серверов
find_serial=( $( echo "${recS_auth[@]}" | tr " " "\n" | sort | uniq | grep . ) )
if [ ! ${#find_serial[@]} -eq 1 ]; then
echo -e "\t ${CL_down}SOA serial mismatch in Authoritative DNS: ${find_serial[@]:-"N/A"}${CL_close}"
# global var ${CL_serial_over}
CL_serial_over="${CL_down}"
else
echo -e "\t ${CL_txt}Find serial: ${CL_ok}${find_serial}${CL_close}"
fi
fi
}
serial_check_locall () {
for ((s=0; s<${#NS_save_locall[@]}; s++)); do
if [ -z "${recS_locall[$s]}" ]; then
local CL_serial_over="${CL_dark}"
recS_locall[$s]="-"
else
if [[ "${find_serial}" =~ "${recS_locall[$s]}" ]]; then
CL_serial="${CL_ok}"
else
CL_serial="${CL_down}"
fi
fi
printf "${CL_orange}%-21s${CL_close} ${CL_serial}${CL_serial_over}%-30s${CL_close}\n" "${NS_save_locall[$s]}" "${recS_locall[$s]}"
done
}
serial_check_public () {
for ((s=0; s<${#NS_save_public[@]}; s++)); do
if [ -z "${recS_public[$s]}" ]; then
local CL_serial_over="${CL_dark}"
recS_public[$s]="-"
else
if [[ "${find_serial}" =~ "${recS_public[$s]}" ]]; then
CL_serial="${CL_ok}"
else
CL_serial="${CL_down}"
fi
fi
printf "${CL_orange}%-21s${CL_close} ${CL_serial}${CL_serial_over}%-30s${CL_close}\n" "${NS_save_public[$s]}" "${recS_public[$s]:--}"
done
}
print_timers () {
# From Pingdom: http://dnscheck.pingdom.com/
# SOA TTL recommended >= 3600.
# SOA refresh recommended >= 14400.
# SOA retry recommended >= 3600.
# SOA expire recommended >= 604800.
# SOA minimum recommended between 300 and 86400.
TIMERS=( $( for (( t=0; t<${#recS_auth_ttl[@]}; t++ )); do
echo "${recS_auth_ttl[t]}"
done | sort | uniq
)
)
if [ ! ${#TIMERS[@]} -eq 4 ]; then
echo -e "\t${CL_down} ERROR IN SOA TIMERS: ${TIMERS[@]:-"NULL"} ${CL_close}"
else
REM_RF="planned zone re-read (recommended >= 14400)"
REM_RT="how offten re-read if fail master (recommended >= 3600)"
REM_EX="how long alive after fail master (recommended >= 604800)"
REM_DF="for application (recommended between 300 and 86400)"
printf "\t ${CL_txt}Refresh: ${CL_ok}%-10s${CL_txt}%-50s${CL_close}\n" "${TIMERS[0]}" "${REM_RF}"
printf "\t ${CL_txt}Retry: ${CL_ok}%-10s${CL_txt}%-50s${CL_close}\n" "${TIMERS[1]}" "${REM_RT}"
printf "\t ${CL_txt}Expire: ${CL_ok}%-10s${CL_txt}%-50s${CL_close}\n" "${TIMERS[2]}" "${REM_EX}"
printf "\t ${CL_txt}Default TTL: ${CL_ok}%-10s${CL_txt}%-50s${CL_close}\n" "${TIMERS[3]}" "${REM_DF}"
fi
}
smtp_ssl_check () {
if [ $master_ok -eq 1 ]; then
SSL_if_support="$( openssl x509 xxx 2>&1 | grep -o "\-checkhost" )"
if [ -z "$SSL_if_support" ]; then
echo -e "${CL_txt}openssl '-checkhost' not support${CL_close}"
return 1
fi
recMX="$( host -W $HOST_WAIT -tMX "${domain}" "${find_master}" 2>/dev/null | awk -F"handled by" '{print $2}' | grep . )"
if [ -z "${recMX}" ]; then
echo "No MX-record"
return 0
fi
MX_value=( $( echo "${recMX}" | awk '{print $2}' | sed 's/\.$//' ) )
MX_prior=( $( echo "${recMX}" | awk '{print $1}' ) )
for ((m=0;m<${#MX_value[@]};m++)); do
#CL_ssl_res=""
SSL_check=""
SSL_proto=""
#RES=""
SSL_check="$( echo | openssl s_client -connect ${MX_value[m]}:25 -starttls smtp 2>&1 | openssl x509 -noout -checkhost ${MX_value[m]} 2>&1 )"
SSL_proto="$( echo | openssl s_client -connect ${MX_value[m]}:25 -starttls smtp 2>&1 | grep Protocol | sed 's/Protocol//' | sed "s/://" | tr -d " " )"
if [[ "${SSL_check}" =~ "unable to load certificate" ]]; then
CL_ssl_res="${CL_dark}"
RES="-"
SSL_proto="${SSL_proto:--}"
elif [[ "${SSL_check}" =~ "does match" ]]; then
CL_ssl_res="${CL_ok}"
RES="Ok"
else
CL_ssl_res="${CL_down}"
RES="mismatch"
fi
MX_prior[m]="[${MX_prior[m]}]"
printf "${CL_orange}%-25s ${CL_dark}%-5s${CL_ssl_res}%-10s%-10s${CL_close}\n" "${MX_value[m]}" "${MX_prior[m]}" "${RES}" "${SSL_proto}"
done
fi
}
# ----------------------- GO RUN ------------------------------------------------------
if get_arpa; then
bl_ch ${domain}
exit 0
fi
get_whois
echo -e "\n ${CL_txt} Authoritative DNS: ${CL_close}"
echo -e " ${CL_txt}${mntby:-mnt-by:}${CL_close}"
echo -e " ${CL_txt}status: ${status[@]:-"n/a"}${CL_close}\n"
echo -e "${CL_txt} NS's \t\t [ A ] [ PTR ] [ rDNS ] ${CL_close}"
get_ns auth
echo -e "\n ${CL_txt} Local DNS (TopNET): ${CL_close}"
get_ns locall
echo -e "\n ${CL_txt} Public DNS (Google, CF, DG Anycast): ${CL_close}"
get_ns public
echo -en "\n ${CL_txt} Compare SOA from authoritative DNS: ${CL_close}\n"
serial_check_auth
serial_check_locall
serial_check_public
print_timers
echo -en "\n ${CL_txt} Check SMTP SSL: ${CL_close}\n"
smtp_ssl_check
echo
exit 0
Invision Power Board
© Invision Power Services