Bash скріпти Linux
Серед системних адміністраторів та звичайних користувачів Linux досить популярна практика писати Bash скрипти для автоматизації та полегшення виконання певних завдань в операційній системі. Фактично, ви один раз написали порядок дій, які потрібно виконати, розписали файли і так далі, а потім просто пишіть одну коротку команду і всі дії виконуються як потрібно. Можна піти ще далі та запланувати автоматичне виконання скрипту. У цій невеликій статті зібрано найкорисніші Linux Bash скрипти, які ви можете використовувати в своїх системах. Деякі з них складаються з кількох рядків, деякі містяться в один рядок. Тут є як невеликі сніпети, які ви можете використовувати у своїх скриптах, так і повноцінні інтерактивні скрипти для роботи з ними через консоль.
TOOLS FOR FIND VULNERABILITY
Команди
Перший скрипт сортує вміст поточної папки за розміром:
du -a -d 1 -h | sort -h
Але в більшості випадків це не ефективно, вам набагато зручніше використовувати утиліту ncdu. Вам потрібно швидко створити пароль і ви не хочете встановлювати pwgen, можете використовувати таку команду:
< /dev/urandom tr -dc '[:punct:][:alnum:]' | head -c${1:-16};echo;
Ця команда запускає найпростіший HTTP сервер у поточній папці. Дуже зручно для налагодження чогось:
python3 -m http.server --bind 127.0.0.1 9000
За допомогою команди at можна запланувати виконання довільної команди один раз у вказаний час, наприклад, опівночі:
echo "ls -l" | at midnight
Хочете завантажити весь сайт на комп'ютер для того, щоб потім мати можливість переглядати його офлайн? Для цього достатньо утиліти wget:
wget --random-wait -r -p -e robots=off -U mozilla https://svyat.tech
Виводить команди bash, які найчастіше використовуються:
history | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head
Записати відео з екрану в терміналі linux:
ffmpeg -f x11grab -r 25 -s 800x600 -i :0.0 /tmp/outputFile.mpg
Запустить команду через вказаний проміжок часу, в даному випадку через 5 секунд:
timeout 5s команда
Видаляє всі порожні папки:
find. -type d -empty -delete
СНІПТЕТИ BASH
Допустимо, ви хочете засікти скільки часу виконується певна дія у вашому Bash скрипті, для цього додайте там, де потрібно почати замір рядка:
START=$(date +%s)
А там, де треба припинити:
END=$(date +%s)
DIFF=$(( $END - $START ))
DIFF=$(( $DIFF / 60 ))
Змінна DIFF міститиме час виконання в хвилинах. Тепер ви можете вивести його за допомогою echo.
Скрипти часто вимагають введення параметрів для правильної роботи. Цей сніпет дозволяє досить просто розбирати передані параметри:
while [ "$1" != "" ];
do
case $1 in
-s) shift SERVER=$1;;
-d) shift DATE = $ 1;;
--paramter | p) shift PARAMETER = $ 1;;
-h|help ) # виведіть повідомлення з підказкою
* ) # інші параметри
Тут ми присвоюємо значення параметра змінної залежно від цього який літерою він позначений. Наприклад, для такого виклику:
parameter_test.sh -s losst -d 20170916 --parameter Subscribe!
Змінній SERVER буде присвоєно значення losst, DATA – 20170916 та PARAMETER – Subscribe. Як це працює? Якщо коротко, то ми завжди використовуємо перший параметр і використовуємо команду shift, щоб зрушити стек з параметрами вліво, коли поточний перший параметр більше не потрібен.
Далі, якщо потрібно переконатися, що важливі параметри задані, можна просто перевірити на існування ці змінні:
if [-z $SERVER] || [-z $DATE]; then
echo "Необхідно вказати сервер та дату";
exit 1;
fi;
Робоча директорія скрипта має важливе значення, якщо потрібно зберегти будь-які дані у файлову систему. Краще виконувати команди у правильній директорії. Також потрібно перевірити, чи має поточний користувач право на запис у поточну папку. Створіть таку функцію:
changedir(){
DIR_NAME=$1
# Перевіряємо чи існує папка
[ -d "$DIR_NAME" ] || {
echo Dir: $DIR_NAME does not
existexit 1}
# Перевіряємо доступ на читання
[ -r "$DIR_NAME" ] || {
echo Dir: $DIR_NAME no readable
exit 2
}
# Перевіряємо доступ на виконання
[ -x "$DIR_NAME" ] || {
echo Dir: cannot cd to $DIR_NAME
exit 3
}
# Перевіряємо доступ на запис
[ -w "$DIR_NAME" ] || {
echo Dir: $DIR_NAME no writeable
exit 4
}
cd $DIR_NAME
echo "Present directory $DIR_NAME"
}
Потім, щоб у скрипті безпечно змінити поточну папку на потрібну додайте:
changedir /шлях/до/папці
Іноді може знадобитися результат роботи попередньої команди. Для цього використовуйте змінну $?:
if [$? -ne 0]; then
echo "Команда завершена невдало";
fi;
Для запису логів із поточним часом та датою створіть таку функцію:
log() {
echo [`date +%Y-%m-%d%H:%M:%S`] $*
}
Наступний сніпет використовується часто в скриптах, які залежать від стану інших системних процесів. Наприклад, може знадобитися переконатися, що MySQL вимкнено, перш ніж виконувати певні дії.
check_process() {
echo "Checking if process $1 exists..."
[ "$1" = "" ] && return 0
PROCESS_NUM=$(ps -ef | grep "$1" | grep -v "grep" | wc -l)
if [$ PROCESS_NUM -ge 1]; then
return 1
else
return 0
fi
}
Тепер повернемося до нашого прикладу з MySQL і використовуємо щойно написану функцію:
check_process mysql;
CHECK_RET=$?;if [$ CHECK_RET -ne 0];
# якщо процес запущено
else
# якщо процес не запущено
fi;
Іноді може знадобитися завантаження змінних файлів. Спочатку створюємо файл зі змінними:
key1=value1
key2=value2
Потім просто додайте такий рядок спочатку скрипта, за умови, що конфігураційний файл знаходиться в цій папці і називається configfile:
. configfile
Значення будуть завантажені у змінні $key1 та $key2. Якщо потрібно перебрати всі файли в поточній папці або за певним шаблоном, використовуйте такий цикл:
#!/bin/bash
PATH=/path/to/dir/FILES=*.sql
for f in $PATH$FILES
do
# Щось робимо з кожним файлом $f
done
Наступну функцію ви можете використовувати для надсилання електронних повідомлень з ваших скриптів. Все, що потрібно, це вказати текст повідомлення, тему та список адрес одержувачів. Ось сама функція:
sendEmail() {
echo $content | mail -s "$subject" $email_list exit;
}
Сканування підмережі
У цьому прикладі bash скрипт просканує мережу щодо хостів, підключених по IP-адресам 10.1.1.1 – 255. Скрипт виведе повідомлення Хост з IP: IP-адресу піднято, якщо команда ping була успішною. Не соромтеся змінювати скрипт для сканування діапазону ваших хостів.
#!/bin/bash
is_alive_ping()
{
ping -c 1 $1 > /dev/null
[ $? -eq 0 ] && echo Хост с IP: $i піднят.
}
for i in 10.1.1.{1..255}
do
is_alive_ping $i & disown done
Виконання
./bash_ping_scan.sh
Вивід
Хост with IP: 10.1.1.1 піднят.
Хост with IP: 10.1.1.4 піднят.
Хост with IP: 10.1.1.9 піднят.
Повідомлення поштою, коли сервер не працює
Приклад скрипт №2 надішле електронного листа на вказану адресу електронної пошти, коли ping не може досягти місця призначення. Системний адміністратор може регулярно виконувати цей скрипт за допомогою планувальника cron. Спочатку скрипт використовує команду ping для перевірки зв'язку з хостом або IP-адресою, вказаною як аргумент. У випадку, якщо це місце призначення недоступне, буде використано команду mail для повідомлення системного адміністратора про цю подію.
#!/bin/bash
for i in $@
do
ping -c 1 $i &> /dev/null
if [ $? -ne 0 ]; then
echo "`date`: ping не пройшов, $i хост лежить !" | mail -s "$i хост лежит!" admin@test.com.ua fi done
Виконання
./check_hosts.sh google.com yahoo.com
Створити логі моніторингу Останній приклад – модифікована версія попереднього прикладу. Якщо в системі немає пошти, скрипт створить файл логів. Ядро скрипта укладено у нескінченний цикл while, який налаштований на виконання перевірки ping щогодини (3600 секунд). Змініть скрипт відповідно до ваших потреб. Видаліть нескінченний цикл while, якщо ви збираєтеся використати цей скрипт із планувальником cron.
#!/bin/bash
LOG=/tmp/mylog.log
SECONDS=3600 EMAIL=admin@test.com.ua
for i in $@; do
echo "$i-UP!" > $LOG.$i
done
while true; do
for i in $@; do
ping -c 1 $i > /dev/null
if [ $? -ne 0 ]; then
STATUS=$(cat $LOG.$i)
if [ $STATUS != "$i-DOWN!" ]; then
echo "`date`: ping не пройшов, $i хост лежить!" |
mail -s "$i хост лежить!" $EMAIL
fi
echo "$i-DOWN!" > $LOG.$i
else
STATUS=$(cat $LOG.$i)
if [ $STATUS != "$i-UP!" ]; then
echo "`date`: пінг пройшов, $i Хост піднят!" |
mail -s "$i Хост піднят !" $EMAIL
fi
echo "$i-UP!" > $LOG.$i
fi
done
sleep $SECONDS
done
Виконання:
./check-server-status.sh google.com yahoo.com 192.168.1.2 mylinuxbox N2100
ВИСНОВКИ
У цій статті ми розглянули корисні bash скрипти linux, які можна використовувати при роботі з системою. Спочатку ми розібрали кілька корисних комбінованих команд, а потім кілька корисних сніпетів.