К профилю facebook
К профилю linkedin
gallery/artage-io-thumb-9cfcd10dceda7ae2d9eb329237ac313a
gallery/screenshot_7

Серед системних адміністраторів та звичайних користувачів Linux досить популярна практика писати Bash скрипти для автоматизації та полегшення виконання певних завдань в операційній системі. Фактично, ви один раз написали порядок дій, які потрібно виконати, розписали файли і так далі, а потім просто пишіть одну коротку команду і всі дії виконуються як потрібно. Можна піти ще далі та запланувати автоматичне виконання скрипту.

 

У цій невеликій статті зібрано найкорисніші Linux Bash скрипти, які ви можете використовувати в своїх системах. Деякі з них складаються з кількох рядків, деякі містяться в один рядок. Тут є як невеликі сніпети, які ви можете використовувати у своїх скриптах, так і повноцінні інтерактивні скрипти для роботи з ними через консоль.

 

 

Команди

 

Перший скрипт сортує вміст поточної папки за розміром:

 

du -a -d 1 -h | sort -h

Bash скрипти Linux
Вернуться назад

Запустить команду через вказаний проміжок часу, в даному випадку через 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 exist
exit 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, які можна використовувати при роботі з системою. Спочатку ми розібрали кілька корисних комбінованих команд, а потім кілька корисних сніпетів.

За допомогою команди at можна запланувати виконання довільної команди один раз у вказаний час, наприклад, опівночі:

 

echo "ls -l" | at midnight

Хочете завантажити весь сайт на комп'ютер для того, щоб потім мати можливість переглядати його офлайн? Для цього достатньо утиліти wget:

 

wget --random-wait -r -p -e robots=off -U mozilla https://svyat.tech

gallery/24059062
gallery/klin [запущено] - oracle vm virtualbox 2022-07-06

Але в більшості випадків це не ефективно, вам набагато зручніше використовувати утиліту ncdu. Вам потрібно швидко створити пароль і ви не хочете встановлювати pwgen, можете використовувати таку команду:

 

< /dev/urandom tr -dc '[:punct:][:alnum:]' | head -c${1:-16};echo;

gallery/2

Ця команда запускає найпростіший HTTP сервер у поточній папці. Дуже зручно для налагодження чогось:

 

python3 -m http.server --bind 127.0.0.1 9000

gallery/3
gallery/4
gallery/5

Виводить команди bash, які найчастіше використовуються:

 

history | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head

gallery/6

Записати відео з екрану в терміналі linux:

 

ffmpeg -f x11grab -r 25 -s 800x600 -i :0.0 /tmp/outputFile.mpg

gallery/7