Bash скріпти Linux

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

TOOLS FOR FIND VULNERABILITY

Логин Свят

12/30/20223 min read

Команди

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

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