Скрипты.

Установка, настройка, эксплуатация.

Модератор: ROOT

Скрипты.

Сообщение ROOT » 17 сен 2015, 19:45

Оглавление


Темы
 Сервис архивации 
 Чистка каталогов по списку 
 Создание пользователей и баз для MySQL 
 Добавление виртуального хоста APACHE 
 Включение по сети (Wake-on-LAN) 
 Построение файлов зон для DNS-сервера 
 Построение MD5-ХЭШ сумм файлов 
 Примеры монтирования CIFS 
 Синхронизация локального репозитория для CentOS 
 Очистка и переиндексация баз данных Postgres 
 Скрипт для архивирования баз 
 Список активных хостов в сети 
 Тестирование хостов сети по списку 
 Управление виртуальными машинами скриптами 
 NMAP: Сканирование хостов и портов (обёртка) 
 Резервное копирование Файловой системы XFS 
Дополнительные материалы
Wake on Lan: Удалённое включение компьютера


 Сервис архивации 
backup-hosts.sh
Код: выделить все
#!/bin/sh
##############################################
# Сервис резервного копирования хостов WEB-сервера
# перечисленных в файле hosts.txt
# Создание архивных копий баз данных MySQL-сервера
# перечисленных в файле db.txt
# Составлено: SSERGEY
# Дата: 12.06.2017 v2.0
#############################################
BASE_PATH="$(dirname $(readlink -f $0))"
file="$BASE_PATH/hosts.txt"
db="$BASE_PATH/db.txt"
BACKUP_PATH="/root/BACKUP/"
WEB_DIR="/var/www/"
DATE=`date +%d-%m-%Y`
LOG="/var/log/backup-hosts.log"
# Максимальное сжатие архивных копий
if [ "$SHELL" == "/bin/bash" ]
        then
                export GZIP=-9
fi

echo "$(date) Создание архивных копий хостов WEB-сервера" >> $LOG

if ! [ -d $BACKUP_PATH$DATE ]
        then
                mkdir $BACKUP_PATH$DATE
        else
                echo "$(date) Каталог $BACKUP_PATH$DATE уже существует!" >> $LOG
fi
cd $WEB_DIR
while read line
do
        case $line in
                [a-zA-Z]* )
                        if [ -d $line ]
                                then
                                        backup=`date +%H-%M`".$line.tar.gz"
                                        tar -zcf $BACKUP_PATH$DATE/$backup $line
                                        if [ $? -eq 0 ];
                                        then
                                                echo "$(date) Создан архив $backup" >> $LOG
                                        fi

                                else
                                        echo "$(date) Хост $line не существует" >> $LOG
                        fi
                ;;
        esac
done < $file

echo "$(date) Архивирование хостов WEB-сервера завершено" >> $LOG
echo "$(date) Созание архивных копий баз данных MySQL-сервера" >> $LOG
while read line2
do
        case $line2 in
                [a-zA-Z]* )
                        if [ -d $line ]
                                then
                                        backup=`date +%H-%M`".$line2.sql"
                    mysqldump -uroot -pRootMySQL --add-drop-database -c -e -B $line2  > $BACKUP_PATH$DATE/$backup
                    if [ $? -eq 0 ];
                    then
                        echo "$(date) Создан архив $backup для базы $line" >> $LOG
                    fi
                else
                    echo "$(date) Ошибка создания архива. Возможно $line2 не существует" >> $LOG
           fi
       ;;
        esac
done < $db

echo "$(date) Архивирование Баз Данных MySQL-сервера завершено" >> $LOG
echo "$(date) Архивирование каталогов и файлов" >> $LOG
cd /var
tar -zcf $BACKUP_PATH$DATE/`date +%H-%M`.named.tar named
cd /
tar -zcf $BACKUP_PATH$DATE/`date +%H-%M`.etc.tar etc
cd /usr/lib/systemd/
tar -zcf $BACKUP_PATH$DATE/`date +%H-%M`.services.tar system
cd /root/
tar -zcf $BACKUP_PATH$DATE/`date +%H-%M`.doc.tar doc
tar -zcf $BACKUP_PATH$DATE/`date +%H-%M`.scripts.tar SH
cd /sbin/
tar -zcf $BACKUP_PATH$DATE/`date +%H-%M`.my-script.tar my-script

Список баз MySQL сервера db.txt
Код: выделить все
acdr
blog-prog
forum
myblog
mysql
nb
pam
proftpd
valak
www
phpmyadmin

Список хостов WEB-сервера hosts.txt
Код: выделить все
acdr.free-adm.ru
blog-prog.free-adm.ru
forum.free-adm.ru
myblog.free-adm.ru
nb.free-adm.ru
pam.free-adm.ru
pma.free-adm.ru
valak.free-adm.ru
wiki.free-adm.ru
www.free-adm.ru

 Подготавливаем скрипт к работе в режиме демона по расписанию 
e /etc/systemd/system/backup-hosts.service
Код: выделить все
[Unit]
Description=Backup Apache virtual hosts & MySQL databases

[Service]
Type=oneshot
ExecStart=/sbin/my-script/backup-hosts.sh
StandardOutput=syslog

cat /etc/systemd/system/backup-hosts.timer
Код: выделить все
[Unit]
Description=Run 20:10 Backup Apache virtual hosts & MySQL databases

[Timer]
OnCalendar=20:10
Persistent=true

[Install]
WantedBy=timers.target

Запуск сервиса
Код: выделить все
systemctl enable --now backup-hosts.timer

Enable для задания означает то, что оно появится в списке заданий, --now - включит задание в работу

Пример задания на ротацию логов в systemd
cat /etc/systemd/system/logrotate.timer
Код: выделить все
[Unit]
Description=Run on 23:59 Rotate log files

[Timer]
OnCalendar=23:59
Persistent=true

[Install]
WantedBy=timers.target

cat /etc/systemd/system/logrotate.service
Код: выделить все
[Unit]
Description=Rotate log files

[Service]
Type=oneshot
ExecStart=/sbin/my-script/logrotate
StandardOutput=syslog

Не забываем снести задание в CRON


 Чистка каталогов по списку 
cat deldir.sh
Код: выделить все
#!/bin/bash
##############################################
# Чистка старых логов в перечисленных
# каталогах с указанием маски
# /var/log/audit/*log.*
# Составлено: SSERGEY
# Дата: 01.10.2015 v1.0
#############################################

BASE_PATH="$(dirname $(readlink -f $0))"
file="$BASE_PATH/deldir.txt"
n=0
echo "==========================================="
while read line
do
    case $line in
    [\/]* )
    #rm -f  $line
    ((++n))
    ;;
    esac
done < $file

echo "Очищено $n каталогов перечисленных в $file"
echo "==========================================="

cat deldir.txt
Код: выделить все
/var/log/audit/*log.*
/var/log/btmp-*
/var/log/cron-*
/var/log/maillog-*
/var/log/secure-*
/var/log/spooler-*
/var/log/samba/old/*
/var/log/httpd/*-*
/var/log/tuned/*log.*
/var/log/cacti/*.gz



 Создание пользователей и баз для MySQL 
cat add-user-sql.sh
Код: выделить все
#!/bin/bash
##############################################
# Создание пользователей и баз для MySQL 6.5
# Составлено: SSERGEY
# Дата: 12.06.2017 v2.0
#############################################
EXPECTED_ARGS=3
E_BADARGS=65
MYSQL=`which mysql`

Q1="CREATE DATABASE IF NOT EXISTS $1 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;"
Q2="GRANT DELETE, INSERT, SELECT, UPDATE ON $1.* TO $2@localhost IDENTIFIED BY '$3';"
Q3="FLUSH PRIVILEGES;"
SQL="${Q1}${Q2}${Q3}"

if [ $# -ne $EXPECTED_ARGS ]
then
        echo "Пример: $0 имя_бд пользователь пароль"
        exit $E_BADARGS
else
        $MYSQL -uroot -e "$SQL"
        echo -e "$1\t\t$2\t\t$3" >> pass
fi



 Добавление виртуального хоста APACHE 
cat add-vh.sh
Код: выделить все
#!/bin/bash
##############################################
# создание виртуальных хостов для APACHE 2.4
# Составлено: SSERGEY
# Дата: 19.09.2015 v1.0
#############################################
WEBROOT="/var/www/"
VHOSTAV="/etc/httpd/sites-available/"
VHOSTEN="/etc/httpd/sites-enabled/"
VSITE="$1.free-adm.ru"

function VHost(){
cat <<EOF > $VHOSTAV$VSITE.conf
<VirtualHost $VSITE:80>
DocumentRoot $WEBROOT$VSITE/public_html
        ServerName $VSITE
        #ServerAlias $VSITE
        ErrorLog $WEBROOT$VSITE/log/error.log
        CustomLog $WEBROOT$VSITE/log/requests.log combined

        <Directory "$WEBROOT$VSITE/public_html">
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
        <IfModule mod_authz_core.c>
                <RequireAny>
                        Require ip 127.0.0.1 195.0.1.0/24
                </RequireAny>
        </IfModule>
        </Directory>

    php_admin_value upload_tmp_dir "$WEBROOT$VSITE/tmp"
    php_admin_value error_log "$WEBROOT$VSITE/log/php.log"
    php_admin_value session.save_path "$WEBROOT$VSITE/sess"
    php_admin_value doc_root "$WEBROOT$VSITE/public_html"
    php_admin_value open_basedir "$WEBROOT$VSITE/public_html"
</VirtualHost>
EOF
}
function Index(){
cat <<EOF > $WEBROOT$VSITE/public_html/index.html
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    <meta http-equiv="content-style-type" content="text/css" />
    <meta http-equiv="content-language" content="ru-ru" />
    <meta http-equiv="imagetoolbar" content="no" />
    <meta name="resource-type" content="document" />
    <meta name="distribution" content="global" />
    <meta name="keywords" content="" />
    <meta name="description" content="" />
    <title>$VSITE</title>
</head>
<body>
    <h1>Стартовая страница для $VSITE<h1>
</body>
</html>
EOF
}

if [ "$1" != '' ]; then
    if [ ! -f "$VHOSTAV$VSITE.conf" ]; then
        VHost
        echo "создан $VHOSTAV$VSITE.conf"
    else
       mv "$VHOSTDIR$VSITE.conf" "$VHOSTDIR$VSITE.bak"
       echo "created $VHOSTAV$VSITE and made a backup of the existing conf"
    fi

    if [ ! -d "$WEBROOT$VSITE/" ]; then
        mkdir -p $WEBROOT$VSITE/{sess,log,tmp,public_html}/
        chown -R apache:apache "$WEBROOT$VSITE"
        echo "Каталог $WEBROOT$VSITE/ создан"
        Index
        ln -s $VHOSTAV$VSITE.conf $VHOSTEN$VSITE.conf
        systemctl reload httpd
        echo "reloaded apache"
    else
        echo "$WEBROOT$VSITE/ Уже существует "
    fi

elif [ "$1" = 'help' ] || [ "$1" = '' ]; then
    echo "Использование:"
    echo "${0##*/}"
    echo "Пример: Для создания hostname просто запустите команду"
    echo "'${0##*/} hostname'"
fi

Создаём базу www и одноимённого пользователя с минимально необходимыми правами
Код: выделить все
CREATE DATABASE IF NOT EXISTS `www` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
GRANT DELETE, INSERT, SELECT, UPDATE ON www.* TO 'www'@'localhost' IDENTIFIED BY 'password';



 Включение по сети (Wake-on-LAN) 
Скрипт написан под стандартный дистрибутив Fedora, но адаптирован для использования на роутере Netgear WNDR3800 с прошивкой dd-wrt. Для полноценной работы скрипта нужен пакет arping из ревозитория rpmsphere
cat wol.sh
Код: выделить все
#!/bin/sh
##############################################
# Скрипт включения машин по сети
# перечисленных в файле vol.txt
# Составлено: SSERGEY
# Дата: 18.12.2019 v2.0
#############################################
ME=`basename $0`
BASE_PATH="$(dirname $0)"
vol="$BASE_PATH/wol.txt"
BRCST="195.0.1.255"
WOL="/usr/sbin/wol"

function start() {
    MAC=`grep $node $vol | awk -F" " '{ print $2 }'`
    echo "Пакет на включение машины $node отправлен"
    $WOL -i $BRCST -p 9 $MAC
}

function create() {
    if grep -q $node $vol;
    then
        echo "Указанное имя $node уже существует"
    else
        MAC=`arping -c 1 -I enp5s0 $node | grep "reply" | awk '{print $5}' | cut -c 2-18`
        echo "$node $MAC" >> $vol
    fi
}

function help() {
    echo -e "\nНазначение: Скрипт включения машин по сети"
    echo -e "\nИспользовать:"
    echo -e "\t\t$ME -s | --start hostname"
    echo -e "\t\t$ME -c | --create hostname"
    echo -e "\t\t$ME -h | --help | -v | --ver"
    echo -e "\nПараметры запуска"
    echo -e "\t\t-s | --start\t-\tВключить машину с указанным именем"
    echo -e "\t\t-c | --create\t-\tСоздать запись о машине на основе DNS-имени"
    echo -e "\t\t-h | --help\t\t-\tПоказать помощь"
    echo -e "\t\t-v | --ver\t\t-\tВыводит версию "
}

function ver() {
    echo -e "\n\t$ME Версия 2.0\t©SSERGEY\tДата: 18.12.2019"
}

if [ $# -eq 0 ]
then
    echo "ОШИБКА: Запуск без параметров не возможен"
    help
    exit 1
else
    for arg in "$@"
    do
        case $arg in
            "-s" | "--start")
            node="$2"
            start
            exit;;

            "-c" | "--create")
                node="$2"
                create
                exit;;

            "-h" | "--help")
                help
                exit;;

            "-v" | "--ver")
                ver
                exit;;

            *)  echo "ОШИБКА: Недопустимый параметр"
                help
                exit 1 ;;
        esac
    done
fi



 Построение файлов зон для DNS-сервера 
cat create-zone.sh
Код: выделить все
#!/bin/bash
##############################################
# создание зонных файлов для DNS-сервера
# Составлено: SSERGEY
# Дата: 13.01.2017 v1.0
#############################################
#ZONEROOT="/var/named/master/"
ZONEROOT="/root/"
HOSTNAME=$1
ZONE=$HOSTNAME | awk -F. '{print $2"."$3}'
HOST=$HOSTNAME | awk -F. '{print $1}'
ZONE_IP=$2 | awk -F. '{print $3"."$2"."$1}'
SN=`date "+%Y%m%d"`."00"
IP=$2
echo "$HOST $ZONE"
function CreateZone(){
cat <<EOF > ${ZONEROOT}${ZONE}.zone
\$TTL 900
\$ORIGIN ${ZONE}.
@     SOA host.${ZONE}. root.${ZONE}. (
                  $SN   ; serial
                  900          ; 15 Minutes slave refresh interval
                  600          ; 10 Minutes slave retry interval
                  2592000      ; 1 month slave copy expire time
                  900          ; 15 Minutes NXDOMAIN cache time
                  )

          NS    host.${ZONE}.
          ;; add Slave server
          ;; IN  NS      ns.example.host.
          MX 10 host.${ZONE}.

@         A     ${IP}
host      A     ${IP}
EOF
}

function CreateZoneRev(){
cat <<EOF > ${ZONEROOT}${ZONE_IP}.zone
\$TTL 30m
\$ORIGIN ${ZONE_IP}.in-addr.arpa.
@       SOA host.${ZONE}. root.${ZONE}. (
                  2016082101
                      10h; slave-server connection preiod
                      1h; retry
                      1w; lifetime
                      1m; negative ttl
                      )

      NS host.${ZONE}.

15    PTR host.${ZONE}.
EOF
}

if [ $ZONE ! "" ]
then
    if [ ! -f "${ZONEROOT}${ZONE}.zone" ];
        then
        CreateZone
        echo "Создана новая зона прямого просмотра ${ZONE}"
    else
       echo "зона ${ZONE} уже существует"
    fi

        if [ ! -f "${ZONEROOT}${ZONE_IP}.zone" ];
        then
                CreateZoneRev
                echo "Создана новая зона обратного просмотра ${ZONE_IP}.in-addr.arpa."
        else
                echo "зона обратного просмотра ${ZONE_IP} уже существует"
                fi

elif [ "$1" = 'help' ] || [ "$1" = '' ] || [ "$2" = '' ];
then
    echo "Использование: Для создания domain.ru просто запустите команду"
    echo "'${0} host.domain.ru 192.168.1.5'"
fi



 Построение MD5-ХЭШ сумм файлов 
cat md5list.sh
Код: выделить все
#!/bin/bash
##############################################
# Сбор MD5-ХЭШ сумм файлов по указанному пути
# Составлено: SSERGEY
# Дата: 10.02.2017 v1.0
#############################################
ME=`basename $0`
function main(){
        file="/tmp/key.txt"
        # Находим все файлы в каталогах ниже указанного
        # Формируем вспомогательный файл md5.sum с ХЭШ-суммами
        find $DIRPATH -type f | xargs md5sum > /tmp/md5.sum
        # Сортировка файла по ХЭШ-суммам
        sort -nk 1 /tmp/md5.sum > md5.sort
        # Создаём вспомогательный файл с ХЭШ-суммами для поиска по ним
        cat md5.sort | awk ' {print $1} ' > $file

        while read line
        do
                # Подсчитываем количество совпадений с суммами в md5.sort
                ad=`grep -c $line md5.sort`
                # Если количество совпадений равно 1, то удаляем строку как не интересующую
                if [ $ad == 1 ]; then
                        sed -i -e "/$line/d" md5.sort
                fi
        done < $file
        # Удаляем вспомогательные файлы
        rm -f /tmp/{md5.sum,key.txt}
}

while getopts "vhd:" opt ;
do
        case $opt in
                d) DIRPATH=$OPTARG
                        main  ;;
                h)      echo "Назначение: Сбор MD5-ХЭШ сумм файлов по указанному пути"
                        echo "Использовать: $ME -d Путь_к_каталогу" ;;
                v)      echo "Версия 1.0" ;;
                *)  echo "Ошибка: Неправильный параметр";
                        echo "Для вызова справки запустите $ME -h";
                    exit 1 ;;
        esac
done

if [ "$1" == '' ]; then
        echo "Ошибка: Запуск без параметров невозможен"
        echo "Для вызова справки запустите $ME -h"
        exit 1
fi



 Примеры монтирования CIFS 
cat mnt-cifs.sh
Код: выделить все
#!/bin/sh
# IPv4
#mount -t cifs //195.0.1.3/SEVEN -o username="ssergey",password="password" /mnt/sergey
# IPv6
#mount -t cifs //fec0:128::10:18:2:182/SEVEN -o username="ssergey",password="password" /mnt/sergey
mount -t cifs //fec0:128::10:18:2:182/SEVEN /mnt/sergey -o username="sergey",password="password"



 Синхронизация локального репозитория для CentOS 
cat repo-updates.sh
Код: выделить все
#!/bin/sh
#######################################################
# Синхронизация локального репозитория для CentOS 7.2
# Составлено: SSERGEY
# Дата: 25.07.2016 v1.0
#######################################################
rsync="rsync -arvth --bwlimit=1024"
mirror="rsync://ftp.yandex.ru/centos"
verlist="7.2.1511"
archlist="x86_64"
baselist="os updates extras"
local=/var/www/repo.free-adm.ru/public_html/centos

for ver in $verlist
do
    for arch in $archlist
    do
           for base in $baselist
           do
                   remote=$mirror/$ver/$base/$arch/
                   $rsync $remote $local/$ver/$base/$arch/
           done
    done
done



 Очистка и переиндексация баз данных Postgres 
cat service-db.sh
Код: выделить все
#!/bin/bash
##############################################
# Обслуживание баз Postgres перечисленных в файле
# Составлено: SSERGEY
# Дата: 01.01.2017 v1.0
#############################################
BASE_PATH="$(dirname $(readlink -f $0))"
file="$BASE_PATH/db.txt"

echo "Остановка сервера 1C"
echo "==========================================="
systemctl stop srv1cv83
echo "Очистка и переиндексация баз данных Postgres"
echo "==========================================="
while read line
do
        case $line in
                [a-zA-Z]* )
                        if `psql -Upostgres -lqt | cut -d \| -f 1 | grep -qw $line`
                        then
                                echo "Очистка базы данных $line"
                                vacuumdb -h localhost -U postgres --analyze --full --dbname=$line > /dev/null
                                echo "Переиндексация базы данных $line"
                                psql -h localhost -Upostgres --dbname=$line -c "REINDEX DATABASE \"$line\";" > /dev/null
                                echo "==========================================="
                        else
                                echo "База $line не существует"
                                echo "==========================================="
                        fi
                        ;;
        esac
done < $file

echo "Запуск сервера 1C"
echo "==========================================="
systemctl start srv1cv83



 backup.sh скрипт для архивирования баз 
db.txt - Список баз для резервирования
Код: выделить все
#!/bin/bash
##############################################
# BACKUP баз Postgres перечисленных в файле
# Составлено: SSERGEY
# Дата: 09.01.2017 v3.0
#############################################
BASE_PATH="$(dirname $(readlink -f $0))"
file="$BASE_PATH/db.txt"
BACKUP_PATH="/1C_backup"
systemctl stop srv1cv83
if [ $? -eq 0 ]
then
        echo "==========================================="
        echo "Сервера 1C остановлен"
        echo "==========================================="
else
        echo "==========================================="
        echo "Не удалось остановить Сервера 1C"
    echo "==========================================="
        exit 1
fi

echo "$BACKUP_PATH - Каталог для архивных копий"
echo "==========================================="
while read line
do
        case $line in
                [a-zA-Z]* )
                        if `psql -Upostgres -lqt | cut -d \| -f 1 | grep -qw $line`
                        then
                                backup=`date +%d-%m-%Y.%H:%M`".$line"
                                pg_dump -h localhost -U postgres -Fc -Z9 -c -C -f $BACKUP_PATH/$backup $line
                                # -Fc - format custom Вывести копию в архивном формате, пригодном
                                #       для дальнейшего использования утилитой pg_restore
                                # -Z9 - Уровень сжатия данных MAX.
                                # -c  - clean Включить в выходной файл команды удаления (DROP) объектов базы данных
                                #       перед командами создания (CREATE) этих объектов. Если дополнительно не указать
                                #       флаг --if-exists, то при восстановлении в базу данных, где некоторые объекты
                                #       отсутствуют, попытка удаления несуществующего объекта будет приводить к ошибке,
                                #       которую можно игнорировать.
                                # -C  - create Сформировать в начале вывода команду для создания базы данных и затем
                                #       подключения к ней. В этом случае не важно, какая база указана в параметрах
                                #       подключения перед выполнением скрипта. Также, если указан ключ --clean, то скрипт
                                #       сначала удалит, а затем пересоздаст базу данных перед подключением к ней.
                                if [ $? -eq 0 ]
                                then
                                        echo "Создан файл $backup копия базы  $line"
                                        echo "==========================================="
                                else
                                        echo "Не удалось создать backup для базы $line"
                    echo "==========================================="
                                fi
                        else
                                echo "База данных $line не существует"
                                echo "==========================================="
                        fi
                        ;;
        esac
done < $file
systemctl start srv1cv83
if [ $? -eq 0 ]
then
        echo "Сервера 1C запущен"
        echo "==========================================="
else
        echo "Не удалось запустить Сервера 1C"
        echo "==========================================="
        exit 2
fi

Или почти готовый сервис
Код: выделить все
#!/bin/bash
##############################################
# Зачатки сервиса
# BACKUP баз Postgres перечисленных в файле
# Составлено: SSERGEY
# Дата: 09.01.2017 v3.0
#############################################
BASE_PATH="${0%/*}"
file="$BASE_PATH/db.txt"
BACKUP_PATH="/1C_backup"
LOG="/var/log/db_backup"
systemctl stop srv1cv83

if [ $? -eq 0 ]
then
        echo "$(date) Сервер 1C остановлен" >> $LOG
else
        echo "$(date) Не удалось остановить Сервер 1C" >> $LOG
        exit 1
fi

echo "$(date) Каталог для архивных копи - $BACKUP_PATH" >> $LOG

while read line
do
        case $line in
                [a-zA-Z]* )
                        if `psql -Upostgres -lqt | cut -d \| -f 1 | grep -qw $line`
                        then
                                backup=`date +%d-%m-%Y.%H:%M`".$line"
                                pg_dump -h localhost -U postgres -Fc -Z9 -c -C -f $BACKUP_PATH/$backup $line
                                # -Fc - format custom Вывести копию в архивном формате, пригодном
                                #       для дальнейшего использования утилитой pg_restore
                                # -Z9 - Уровень сжатия данных MAX.
                                # -c  - clean Включить в выходной файл команды удаления (DROP) объектов базы данных
                                #       перед командами создания (CREATE) этих объектов. Если дополнительно не указать
                                #       флаг --if-exists, то при восстановлении в базу данных, где некоторые объекты
                                #       отсутствуют, попытка удаления несуществующего объекта будет приводить к ошибке,
                                #       которую можно игнорировать.
                                # -C  - create Сформировать в начале вывода команду для создания базы данных и затем
                                #       подключения к ней. В этом случае не важно, какая база указана в параметрах
                                #       подключения перед выполнением скрипта. Также, если указан ключ --clean, то скрипт
                                #       сначала удалит, а затем пересоздаст базу данных перед подключением к ней.
                                if [ $? -eq 0 ]
                                then
                                        echo "$(date) Создан файл $backup копия базы $line" >> $LOG
                                else
                                        echo "$(date) Не удалось создать backup для базы $line" >> $LOG
                                fi
                        else
                                echo "$(date) База данных $line не существует" >> $LOG
                        fi
                        ;;
        esac
done < $file

systemctl start srv1cv83
if [ $? -eq 0 ]
then
        echo "$(date) Сервер 1C запущен" >> $LOG
else
        echo "$(date) Не удалось запустить Сервер 1C" >> $LOG
        exit 2
fi

в итоге получаем в каталоге ~/backup файлы по формату "дата.имя_базы"
Код: выделить все
07-09-2015.OLGA



 Список активных хостов в сети 
Сформировать список активных хостов в сети можно так:
Код: выделить все
fping -Asg 195.0.1.0/24 -r2 | /bin/grep alive | cut -d ' ' -f1  >> fping.txt

Результат записывается в файл fping.txt в текущем каталоге. Для функционирования необходима утилита fping которая ставиться из одноимённого пакета
Код: выделить все
dnf install fping



 Тестирование хостов сети по списку 
список участвующих файлов
Код: выделить все
arp-ping.sh     dns-list        ip-list         ping-host.sh

Основной скрипт ping-host.sh
Код: выделить все
#!/bin/bash
##############################################
# PING по IP из списка в файле,
# поиск в прямой и обратной DNS-зоне
# Составлено: SSERGEY Дата: 29.12.2014 v1.5
#############################################
while read LINE; do
    LINE2=`echo ${LINE}|grep -E -o "(^[0-9]{1,3}[\.])([0-9]{1,3}[\.])([0-9]{1,3}[\.])([0-9]{1,3})"`
    # Если строка является IP-адресом
    if [ "$LINE" == "$LINE2" ]
    then
        fping -ac 1 $LINE 2> /dev/null
        if [ $? = 0 ]
        then
            printf "Пингуется $LINE  "
            dns=`host $LINE`
            # Определяем A-запись
            if [[ $dns != *"found"* ]]
            then
                dns=`echo $dns|cut -f 5 -d ' '|sed 's/.$//'|cut -f 1 -d ' '` #только одно имя
                printf "DNS-имя $dns "
                ptr=`host $dns`
                # Определяем PTR-запись
                if [[ $ptr != *"found"* ]]
                then
                    ptr=`echo $ptr|cut -f 4 -d ' '`
                    printf "PTR-запись $ptr \n"
                   echo ====================================
                else
                    printf "PTR-запись отсутствует \n"
                  echo ====================================
                fi
            else
                printf "A-запись отсутствует \n"
                echo ====================================
            fi
        else
            # Ошибка пинга
            printf "хост не доступен \n"
            echo ====================================
        fi
    fi
done < ip-list

дополнительный скрипт arp-ping.sh
Код: выделить все
#!/bin/bash
#-vx
##############################################
# Сканирование MAC-адресов по списку из файла
# Составлено: SSERGEY Дата: 19.12.2014 v1.0
#############################################
while read LINE; do
    LINE2=`echo ${LINE}|grep -E -o "(^[0-9]{1,3}[\.])([0-9]{1,3}[\.])([0-9]{1,3}[\.])([0-9]{1,3})"`
    if [ "$LINE" == "$LINE2" ]
    then
        arp=`arping -c1 ${LINE} |grep -P -o '((([0-9a-fA-F]{2})[ :-]){5}[0-9a-fA-F]{2})'`
        if [ $? = 0 ]
        then
            echo $arp $LINE
        fi
    fi
done < ip-list



 Управление виртуальными машинами скриптами 
Скрипт управления виртуальными машинами решает следующие задачи:
  1. создание файла со списком всех машин что есть в VirtualBox (в каталоге со скриптом)
  2. Запуск виртуальных машин по списку из файла
  3. Завершение всех запущенных машин (затачивалось под завершение системы)
  4. Вывести список запущенных машин
  5. Все действия с виртуальными машинами производятся от имени пользователя под котором они находятся

cat /sbin/my-script/vb-mng.sh
Код: выделить все
#!/bin/bash
##############################################
# Скрипт управления виртуальными машинами VirtualBox
# перечисленных в файле vb.txt
# ПРИМЕЧАНИЕ: В именах машин крайне нежелательны.
# Составлено: SSERGEY
# Дата: 29.10.2017 v1.0
#############################################
ME=`basename $0`
BASE_PATH="$(dirname $(readlink -f $0))"
vb="$BASE_PATH/vb.txt"
user="sergey"
DATE=`date +%d-%m-%Y`
LOG="/var/log/vb-mng.log"
# Шаблон ID виртуальной машины для проверки прочитанного из файла значения
REGEX="^[[:xdigit:]]{8}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{12}"

# --type gui - используется стандартный графический интерфейс (по умолчанию)
# --type sdl - Для запуска виртуальной машины с использованием простого графического
#                               интерфейса без элементов управления в фоновом режиме
# --type headless - Для запуска виртуальной машины без GUI в фоновом режиме
type="sdl"
# Чтобы запустить виртуальную машину без GUI:
#  VBoxHeadless --startvm Crunchabang
function start() {
        echo "$(date) ### Запуск виртуальных машин VirtualBox ###" >> $LOG
        # читаем файл со списком виртуальных машин построчно
        while read line
                do
                        # Проверяем является ли строка закомментированной
                        if [[ $line =~ $REGEX ]];
                        then
                        case $line in
                                * )
                                        # Проверяем существование виртуальной машины с именем в VirtualBox
                                        su $user -c "vboxmanage list vms | grep $line > /dev/null"
                                        if [ $? -eq 0 ]
                                        then
                                                # Запускаем виртуальную машину и проверяем успешность запуска по коду ответа
                                                su $user -c "virtualbox --startvm \"$line\" --type $type &"
                                                # Для запуска без графики (возможно сгодиться для сервиса запуска)
                                                # su $user -c "VBoxHeadless -startvm \"$line\" &"
                                                if [ $? -eq 0 ];
                                                then
                                                        # Определяем Имя по ID виртуальной машины для занесения в LOG
                                                        name=`su sergey -c "vboxmanage list vms" | grep "$line" | awk -F\" '{print $2}'`
                                                        echo "$(date) Виртуальная машина $name стартовала" >> $LOG
                                                fi
                                        else
                                                # Если запуск прошёл неудачно то заносим об этом запись в LOG
                                                echo "$(date) Виртуальной машины с указанным именем  $line не существует" >> $LOG
                                        fi
                        ;;
                        esac
                        else
                                # Если строка закомментирована, то пропускаем итерацию цикла
                                continue
                        fi

        done < $vb
}

function stop() {
        su $user -c "vboxmanage list runningvms | sed -r 's/.*\{(.*)\}/\1/' | xargs -L1 -I {} VBoxManage controlvm {} acpipowerbutton"
        if [ $? -eq 0 ];
    then
                echo "$(date) Завершение работы запущенных виртуальных машин"  >> $LOG
        else
                echo "$(date) Не удалось завершить работу виртуальных машин" >> $LOG

        fi
}

function create() {
        su $user -c "vboxmanage list vms | sed 's,[\"{}],,g;s/ /\n/g;s/^/##/'" > $vb
        echo -e "\n\tПроверить имена машин, в созданном файле $vb, на предмет переноса строки\n"
}

function show() {
        # Показать список запущенных машин
        su $user -c "vboxmanage list runningvms"
}

function help() {
        echo -e "\nНазначение: Скрипт управления виртуальными машинами VirtualBox"
        echo -e "\nИспользовать: $ME start | stop | show | create | -h | --help | -v | --ver\n"
        echo -e "\n\tПараметры запуска\n"
        echo -e "\t\tstart - Запустить виртуальные машины"
        echo -e "\t\tstop - Остановить запущенные виртуальные машины"
        echo -e "\t\tshow - Вывести список запущенных машин"
        echo -e "\t\tcreate - Создать файл с именами запущенных машин"
        echo -e "\t\t-h | --help - Показать помощь"
        echo -e "\t\t-v | --ver - выводит версию "
}

function ver() {
        echo "Версия 1.0"
        echo "© SSERGEY  Дата: 29.10.2017"
}

for arg in "$@"
do
    case $arg in
                "start" )                       start ;;
                "stop"  )                       stop ;;
                "show"  )           show ;;
                "create" )                      create ;;
                "-h" | "--help" )       help ;;
                "-v" | "--ver" )        ver  ;;
                *)                                      help
                                                        echo "ОШИБКА: Недопустимый параметр"
                                                        exit 1 ;;
        esac
done

Примерный вид файла со списком машин для их запуска
cat vb.txt
Код: выделить все
##TEST
2cdf77d5-0ff4-4a57-9499-fa38041bc74c

Теперь с помощью systemd создадим возможность выключать все запущенные машины. Для этого создадим сервис shutdown.service
cat /etc/systemd/system/shutdown.service
Код: выделить все
[Unit]
# Описание сервиса Действия при завершении системы
Description=System Shutdown Actions
# Отключить неявные зависимости
DefaultDependencies=no
# запускать данный юнит прежде чем указанные ниже.
Before=shutdown.target reboot.target halt.target

[Service]
# Тип сервиса - полезен для скриптов, которые выполняют одно задание и завершаются
Type=oneshot
# Запускаем исполняемый скрипт данного сервиса
ExecStart=/sbin/my-script/shutdown.sh
[Install]
# Содержит рекомендации по установке юнита. Описывает, в каких случаях юнит должен быть запущен.
# WantedBy - описывает, в каких случаях юнит должен быть активирован.
WantedBy=halt.target reboot.target shutdown.target

Этот сервис при завершении системы вызывает скрипт shutdown.sh в котором перечисляются действия при завершении системы
Теперь включаем сервис
Код: выделить все
systemctl enable shutdown.service

Либо можно обойтись без написания своего юнита, поместив нужные скрипты в
Код: выделить все
/usr/lib/systemd/system-shutdown

cat /sbin/my-script/shutdown.sh
Код: выделить все
#!/bin/bash
/sbin/my-script/vb-mng.sh stop
...

Запуск машин можно выполнить через автозапуск в любой графической оболочки
Код: выделить все
/sbin/my-script/vb-start.sh start

Либо написать сервис, подобный тому что изложен выше.


 NMAP: Сканирование хостов и портов (обёртка) 
Код: выделить все
#!/bin/bash
#############################################
# Тестирование хостов на открытые порты
# Группа хостов проверяется на конкретный порт, а конкретный
# хост на доступность всего диапазона портов
# Составлено: SSERGEY  Дата: 16.11.2020 v1.1
#############################################
ME=`basename $0`

if [[ $1=="i" ]] || [[ $1=="t" ]]
then
    # Проверка переменных на корректность
    REGIP="^([0-9]{1,3}\.){3}[0-9]{1,3}$"
    if [[ $2=~$REGIP ]]
    then
        ip="$2"
    else
        echo "Введённое значедие не является IP адресом"
        exit
    fi
fi

if [[ $1=="s" ]]
then
    REGSUB="^([0-9]{1,3}\.){3}[0-9]{1,3}(/[0-9]{1,3})$"
    REGPORT="^([0-9]{1,2})$"
    if [[ $2=~"$REGSUB" ]]
    # && [[ $3=~$REGPORT ]]
    then
        subnet="$2"
        port="$3"
        echo "Введённое"
    else
        echo "Введённое значедие не является адресом подсети"
        exit
    fi
fi

function SUBNET() {
    nmap -p $port -sT $subnet -oG res
    cat res |grep open >result
}

function IP() {
    nmap -PE $ip -oN resultip
}

function OSSTYPE() {
    nmap -O --osscan-guess $ip
}

function help(){
    printf "\n\t\tСправка
\t$ME: Тестирование хостов на открытые порты
\n\t\tПараметры:
\t-s 192.168.1.0/24 80 - Сканировать хосты подсети для порта 80
\t-i 192.168.1.45  - Сканировать все порта на хосте
\t-t - Предположительная информация об установленной ОС на хосте
\t-v - Вывод версии $ME
\t-h - Вывод этой справки\n"
}

function version() {
    printf "\n\t$ME Версия 1.1 Дата: 16.11.2020\n"
}

function err(){
    echo -e "\n\tОшибка: Неверный или пустой параметр запуска"
    echo -e "\n\tДля вызова справки запустите $ME -h\n"
}

if [ -z "$1" ] && [-n "$1" ]; then
    err
    exit 1
else
    if [ $1="i" ]
    then
        while getopts "sithv" OPT ;
        do
        case ${OPT} in
            s)  SUBNET ;;
            i)  IP ;;
            t)  OSSTYPE ;;
            h)  help ;;
            v)  version ;;
            *)  err
                exit 1 ;;
        esac
            done
    fi
fi



 Резервное копирование Файловой системы XFS 
Код: выделить все
#!/bin/bash
#-vx
#############################################
# Резервное копирование Файловой системы XFS
# Составлено: SSERGEY  Дата: 13.09.2019 v3.0
#############################################
ME=`basename $0`
DATE=`date '+%d-%m-%Y'`
# куда монитируется раздел для backup'ов
BACKUP="/mnt/BACKUP/$DATE"
declare -a EXT
EXT=(".*old" ".*OLD" ".*gz" ".*([0-9]{8})" ".*([0-9]{8}|old|OLD|gz)" ".*([a-z].[0-9])")
declare -a PATHLOG
PATHLOG=("/var/www/*/log" "/var/log")
declare -A DEV
DEV=([boot]="/dev/nvme0n1p2" [root]="/dev/nvme0n1p3" [home]="/dev/nvme0n1p4" [var]="/dev/nvme0n1p5")
#######################################
function ClearLogs(){
    dnf clean all
    rm -f /var/cache/abrt-di/*
    rm -f /var/core/*
    # Очищаем старые логи
    for ((i=0; i<${#PATHLOG[@]}; i++)); do
        for ((x=0; x<${#EXT[@]}; x++)); do
            find ${PATHLOG[i]} -regextype posix-egrep -regex  '${EXT[x]}$' -type f  -print0 | xargs -0 rm -f
        done
    done
    unset PATHLOG EXT
    journalctl --rotate && journalctl --vacuum-time=1s -o short 2> /tmp/journ && tail -n1 /tmp/journ && rm -f /tmp/journ
    sync && echo 3 > /proc/sys/vm/drop_caches && sync
}
#######################################
function CreateBackup() {
    mkdir -p $BACKUP
    # Монтируем раздел для архивов Монтируем boot и root (/) в режиме RO
    xfs_freeze -f / && xfs_freeze -f /boot && xfs_freeze -f /home && xfs_freeze -f /var
    if [ $? -eq 0 ]
    then
        for key in "${!DEV[@]}"; do
            xfsdump -l 0 -L "Backup level 0 of ${key} $DATE" -M "file" -f "$BACKUP/${key}.dump" ${DEV[$key]} > /dev/null 2>&1
            if [ $? -eq 0 ]
            then
                echo "ДАМП раздела ${key} (${DEV[$key]}) успешно создан"
            fi
        done
    xfs_freeze -u / && xfs_freeze -u /boot && xfs_freeze -u /home && xfs_freeze -u /var
    else
        echo "Ошибка монтирования разделов"
    fi
}

function MakePart () {
    if [ ! -e "$DISK" ]; then
        printf "\n\tУказанный диск $DISK не существует"
        exit 1
    else
        printf "\n\tСоздание структуры разделов на $DISK"
        printf "\nТаблица разделов: gpt

            Модель: Seagate BarraCuda Q5 ZP500CV30001 (nvme)
            Диск /dev/nvme0n1: 476940MiB
            Таблица разделов: gpt

            Номер  Начало      Конец       Размер      Размер     Файловая система  Имя                   Флаги
             1     2048s       411647s     409600s     200MiB     fat16             EFI System Partition  загрузочный, esp
             2     411648s     1460223s    1048576s    512MiB     xfs               Boot
             3     1460224s    211175423s  209715200s  102400MiB  xfs               RootFS
             4     211175424s  840321023s  629145600s  307200MiB  xfs               HomesDir
             5     840321024s  871778303s  31457280s   15360MiB   xfs               Var"

        # Структура разделов загрузочного диска
        # parted -a optimal -s $DISK 'mklabel msdos' \
        # 'mkpart primary fat32 2048s 411647s' 'set 1 efi on' 'name 1 "EFI System Partition"' \
        # 'mkpart primary xfs 411648s 1460223s'  'name 2 "Boot"' \
        # 'mkpart primary xfs 1460224s 211175423s' 'name 3 "RootFS"' \
        # 'mkpart primary xfs 211175424s 840321023s' 'name 4 "HomesDir"' \
        # 'mkpart primary xfs 840321024s 871778303s' 'name 5 "Var"'
    fi
}

function RecoveryDump () {
    printf "\n\tВосстановление файловой системы"
    echo $DISK"1"
    # xfsrestore -f /dev/st0 -L "Backup level 0 of boot" /mnt/boot/
    # xfsrestore -f /dev/st0 -L "Backup level 0 of root" /mnt/boot/
}

function help(){
    printf "\n\t\t\t\t\t\tСправка
\t$ME: Управление бэкапами файловой системы XFS
\n\t\t\t\t\t\tПараметры:
\t-b - Создать ДАМП файловой системы
\t-c - Создание структуры разделов на целевом диске
\t-r - Восстановление файловой системы из резервной копии
\t-v - Вывод версии $ME
\t-h - Вывод этой справки
\n\t\t\t\t\t\tИспользовать в SINGLE USER
\tЧтобы загрузить в монопольном режиме компьютер с загрузчиком GRUB, выполните
\tследующие действия:
\t1. Увидев окно приветствия GRUB при загрузке, нажмите любую клавишу для входа
\tв интерактивное меню GRUB.
\t2. Выберите Fedora с версией ядра, которую вы хотите загрузить, и нажмите \"e\"
\tдля редактирования параметров запуска ядра.   Перейдите к концу строки и введите
\tsingle или число \"1\" (номер уровня запуска системы) в качестве параметра
\t3. Нажмите CTRL+x или F10 для выхода из режима редактирования параметров ядра.
\tПосле выхода произойдёт запуск системы с откорректированными параметрами
\tИли можно перевести систему в режим восстановления выполнив команду:
\t\t\tsystemctl isolate rescue.target\n"
}

function version() {
    printf "\n\t$ME Версия 3.0 Дата: 10.03.2019\n"
}

function err(){
    echo -e "\n\tОшибка: Непверный или пустой параметр запуска"
    echo -e "\n\tДля вызова справки запустите $ME -h\n"
}

if [ -z "$1" ]
then
    err
    exit 1
else
    while getopts "bсrhv" opt ;
    do
        case $opt in
            b)  ClearLogs
                CreateBackup ;;
            с)  DISK="/dev/$2" ;
                MakePart ;;
            r)  DISK="/dev/$2" ;
                RecoveryDump ;;
            h) help ;;
            v) version ;;
            ''|*) err
                exit 1 ;;
        esac
    done
fi
Для желающих отблагодарить
SB: 4274320029755744
QIWI: +79175241450
Аватар пользователя
ROOT
Администратор
 
Сообщений: 145
Зарегистрирован: 01 авг 2011, 09:36
Откуда: Моск. обл., г. Железнодорожный

Вернуться в Fedora

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron