На одном из объектов бэкап построен на базе bash скриптов, списком копируемых к нему выступает файл с таким содержимым:
user@server:~$ head -n 2 /opt/scripts/backup/compoff.txt #Номер;Имя ПК;имя пользователя;айпи (не обязательно);мак адрес;выключать или нет 1;AIVANOV;aivanov;10.21.2.140;D8:BB:C1:5B:6E:5D;1
Собственно сам скрипт обходит список, шлет WOL, ожидает и проверяет по пингу включился ли ПК, если да, то помещается в массив для обработки, иначе репорт на почту. Хорошо работает вот уже лет 7. Но иногда есть потребность во включении определенного ПК из этого списка, и дабы автоматизировать поиск, отправку WOL и проверку, написал скрипт. Также нужно учесть то, что компьютеры находятся в разных сегментах сети, поэтому посыл будет с двух серверов.
Условия:
- наличие wakeonlan на всех причастных серверах
- ssh ключи на причастных серверах (не рут)
Собственно сам скрипт:
#!/bin/bash compofftxt="/opt/scripts/backup/compoff.txt" #Домен нужен для пинга domen="domen.ru" # Функция wol на входе имеет массив мак адресов. Обходит их и отправляет команду wakeonlan. Быстрее было бы отправить на второй сервер массив, но так не красиво function wol { local macArray="$@" if [ -n "$macArray" ] then echo -e "\n\e[33mMAC list processing...\e[37m" for mac in ${macArray[*]} do echo " Fnode1: " | tr -d '\n' wakeonlan $mac echo " Fnode2: " | tr -d '\n' ssh fnode2 wakeonlan $mac echo "" done else echo "Array is empty!" fi } echo -e "\n\e[33mScript WOL.sh is run\e[37m" # Если аргументов 0, тогда спросим у пользователя, может надо включить все компьютеры? # Соответственно источником для формирования списка MAC адресов будет выступать или сам файл или патерны из аргументов if [ $# -eq 0 ] then echo -e "\e[31mTemplate not set!\e[37m" read -p $'\e[33mDo you want to run wake on lan for all PC? (y/n)[n]: \e[37m' answer if [[ "$answer" = "y" || "$answer" = "Y" ]] then echo "\e[33mRun WOL\e[37m" source=$(grep -v "#" $compofftxt) allWOL=1 else echo -e "\e[31mCancle\e[37m\n" exit fi else echo -e "\e[33mGot $# pattern\e[37m" source="$@" allWOL=0 fi # Формируем список MAC адресов MacArray=() for str in ${source[*]} do if [ $allWOL -eq 0 ] then pattern=$str mac=`grep -v "#" $compofftxt | grep -i $pattern -m 1 | awk -F";" '{print $5}'` name=`grep -v "#" $compofftxt | grep -i $pattern -m 1 | awk -F";" '{print $2}'` else mac=`echo $str | awk -F";" '{print $5}'` name=`echo $str | awk -F";" '{print $2}'` fi if [ -n "$mac" ] then echo " Pattern \"$pattern\" returned \"$name\" with MAC=\"$mac\"" MacArray+=("$mac") else echo " Pattern \"$pattern\" didn\`t return anything" fi done # Отправляем список MAC адресов функции wol if [ "${#MacArray[*]}" -gt 0 ] then echo -e "\e[33mFound ${#MacArray[*]} MAC address\e[37m" wol ${MacArray[*]} else echo -e "\e[33mExit\e[37m\n" exit fi # Спрашиваем, нужна ли проверка? # При проверке мы опять обращаемся к файлу, но патерном выступает именно MAC адрес. Можно изначально формировать список имя-MAC, но мне лень read -p $'\e[33mDo you want check wake up PC? (y/n)[n]: \e[37m' answer if [[ "$answer" = "y" || "$answer" = "Y" ]] then # вот это простенький таймер, компам даже на SSD нужно секунд 30 на включение for ((i=30;i>=0;i--)) do printf "\e[33mWait: %02d sec\r\b\e[37m" $i sleep 1 done echo -e "\n\e[33mState PC:\e[37m" for str in ${MacArray[*]} do name=`grep -v "#" $compofftxt | grep -i $str -m 1 | awk -F";" '{print $2}'` if [ -n "$name" ] then ping -c 3 "$name.$domen">/dev/null 2>/dev/null erping=$? if [ $erping -eq 0 ] then echo -e " \e[32m$name PC is on \e[37m" else echo -e " $name PC is off" fi fi done echo -e "\e[33mExit\e[37m\n" else echo -e "\e[33mExit\e[37m\n" fi
Не обошлось без свистоперделок в виде цветного вывода. Собственно скрипт выкладываю как шпаргалку по следующим вопросам:
- Запрос ввода от пользователя (аналог для Mikrotik)
- Перенаправление вывода (ping -c 3 "$name.$domen">/dev/null 2>/dev/null)
- Обработка кода возврата ($?)
- Операторы сравнения, в т.ч. AND/OR (&&/||)
- Работа с функциями
- Работа с массивами, в т.ч. передача функции
- Покраска текста
- Таймер
Также можно, прикола ради, чуть дописать скрипт так, чтобы его можно было запускать смской через wAP LTE и получать ответ.
Комментариев нет:
Отправить комментарий