You are currently viewing Как се пишат скриптове в Bash – Linux Terminal

Как се пишат скриптове в Bash – Linux Terminal

Какво е Bash

  • Поддръжка на променливи, цикли и условни изрази.
  • Възможност за редиректиране на входа и изхода (input/output redirection).
  • Вградени команди за обработка на текстови файлове и данни.
  • Способност за изпълнение на команди и скриптове, записани във файл.
  • Интерактивен интерфейс, който позволява на потребителите да въвеждат и изпълняват команди директно.

Bash е много популярен сред системните администратори, разработчици и ентусиасти на Linux поради неговата гъвкавост и широка поддръжка.

Linux команди в Bash

  1. Основни команди: Това са прости команди, като ls за изброяване на файлове в директория, cd за промяна на текущата директория, cp за копиране на файлове, mv за преместване или преименуване на файлове, rm за изтриване на файлове, и т.н.
  2. Филтриращи и обработващи текст команди: Команди като grep за търсене на текст, sort за сортиране на редове в текст, awk и sed за сложна обработка на текстови данни.
  3. Работа с мрежата: Команди като ping за проверка на мрежова връзка, ssh за отдалечен достъп до други системи, scp за копиране на файлове през мрежата.
  4. Управление на системата и процесите: Команди като top за преглед на активните процеси, ps за изброяване на текущите процеси, kill за прекратяване на процеси.
  5. Работа с диска и файловата система: Команди като df за проверка на свободното дисково пространство, du за измерване на дисковото пространство, заето от файлове и директории.
  6. Персонализация и скриптове: Bash също позволява на потребителите да пишат скриптове, които са последователности от команди, за автоматизиране на задачи.
  7. Помощ и информация: Команди като man и info предоставят помощна информация и документация за други команди.

Всички тези команди и техните опции помагат на потребителите да управляват и контролират своята Linux система ефективно, да автоматизират задачи и да обработват данни по гъвкав и мощен начин.

Какво е pipe в bash

Ето пример как pipe се използва в Bash:

Bash
command1 | command2 | command3

В този пример:

  • command1 се изпълнява и нейният стандартен изход (стандартен output) се подава към command2.
  • command2 обработва данните, получени от command1, и изпраща своя изход към command3.
  • command3 получава изхода от command2 и извършва своята функция.

Този метод е особено полезен за обработка на текстови данни, филтриране на резултати, анализ на логове и други подобни задачи. Той позволява на потребителя да комбинира множество прости команди, за да изгради сложни операции обработка на данни.

Променливи в Bash

  1. Деклариране на променливи: За да създадете променлива в Bash, просто я назначете без да използвате интервал. Например: myvariable="Hello, World!".
  2. Използване на променливи: За да използвате стойността на променлива, използвайте $ пред името на променливата. Например: echo $myvariable ще отпечата “Hello, World!”.
  3. Експортиране на променливи: Променливите по подразбиране са локални за текущата обвивка (shell). За да ги направите достъпни за дъщерните процеси, използвайте командата export: export myvariable.
  4. Специални променливи: Bash предоставя редица специални променливи, като $PATH, $HOME и $USER, които съдържат важна системна информация.
  5. Променливи на средата: Това са глобални променливи, които влияят на поведението на обвивката и на други програми, изпълнявани от обвивката.
  6. Позиционни променливи: В Bash скриптовете, $1, $2, $3, и т.н., представляват аргументите, подадени на скрипта.
  7. Използване на кавички: Двойните кавички (") позволяват интерпретирането на променливите вътре в тях, докато единичните кавички (') не го позволяват. Например: echo "$myvariable" и echo '$myvariable' ще дадат различни резултати.
  8. Съхраняване на командни резултати в променливи: Можете да запишете изхода от команда в променлива, използвайки $(command) синтаксиса. Например: today=$(date).

Тези основни принципи на работа с променливи в Bash предоставят гъвкави възможности за управление на данни и контрол на поведението на скриптовете и обвивката.

Какво е echo в Bash

Ето няколко основни примера за използването на echo:

  1. Отпечатване на прост текст:
Bash
echo "Здравей, свят!"

Тази команда ще отпечата “Здравей, свят!” на екрана.

Използване на променливи:

Bash
приветствие="Здравей, свят!"
echo $приветствие

Тук, echo ще отпечата стойността на променливата приветствие.

Създаване на файлове с определено съдържание:

Bash
echo "Някакъв текст" > файл.txt

Тази команда ще създаде файл с име файл.txt, съдържащ текста “Някакъв текст”.

Добавяне на текст към съществуващ файл:

Bash
echo "Допълнителен текст" >> файл.txt

Това ще добави “Допълнителен текст” към края на файл.txt, без да изтрива съществуващото съдържание.

Отпечатване на специални символи: За да се отпечатат специални символи (като нов ред или табулация), се използват ескейп-секвенции. Например, \n за нов ред и \t за табулация:

Bash
echo -e "Първи ред\nВтори ред"
  1. Опцията -e позволява интерпретирането на тези ескейп-секвенции.

echo е многофункционална и широко използвана команда в Bash скриптовете за показване на информация, диагностика на скриптове и манипулиране на текстови данни.

Пример за Bash скрипт с “start|stop|restart”

Един примерен Bash скрипт, който обработва командите “start”, “stop” и “restart”, може да изглежда така:

Bash
#!/bin/bash

# Примерен скрипт с команди start, stop и restart

# Функция за стартиране на процес или услуга
start_service() {
    echo "Стартиране на услугата..."
    # Тук добавете команди за стартиране на услугата
}

# Функция за спиране на процес или услуга
stop_service() {
    echo "Спиране на услугата..."
    # Тук добавете команди за спиране на услугата
}

# Функция за рестартиране на процес или услуга
restart_service() {
    echo "Рестартиране на услугата..."
    # Тук добавете команди за рестартиране на услугата
    stop_service
    start_service
}

# Проверка на аргументите
case "$1" in
    start)
        start_service
        ;;
    stop)
        stop_service
        ;;
    restart)
        restart_service
        ;;
    *)
        echo "Използвайте: $0 {start|stop|restart}"
        exit 1
esac

exit 0

Този скрипт предполага, че имате определени команди или процедури за стартиране, спиране и рестартиране на услуга. Можете да персонализирате функциите start_service, stop_service и restart_service, за да отговарят на специфичните нужди на вашата услуга или приложение.

За да използвате скрипта, запазете го във файл, например с име service_control.sh, и го направете изпълним с командата chmod +x service_control.sh. След това можете да го стартирате с една от следните команди:

  • ./service_control.sh start
  • ./service_control.sh stop
  • ./service_control.sh restart

Реален скрипт start|stop|restart на Bash с iptables

Ето един примерен Bash скрипт, който използва iptables за управление на мрежови правила чрез командите “start”, “stop” и “restart”. Скриптът предполага, че вече имате някаква конфигурация за iptables, която искате да управлявате.

Bash
#!/bin/bash

start_iptables() {
    echo "Стартиране на iptables правила..."
    iptables -P INPUT DROP
    iptables -P FORWARD DROP
    iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    iptables -A INPUT -i lo -j ACCEPT
    iptables -A INPUT -p tcp --dport 22 -j ACCEPT
    iptables -A INPUT -p tcp --dport 80 -j ACCEPT
    iptables -A INPUT -p tcp --dport 443 -j ACCEPT
}

stop_iptables() {
    echo "Спиране на iptables правила..."
    iptables -F
    iptables -t nat -F
    iptables -t mangle -F
    iptables -X
}

restart_iptables() {
    echo "Рестартиране на iptables правила..."
    stop_iptables
    start_iptables
}

case "$1" in
    start)
        start_iptables
        ;;
    stop)
        stop_iptables
        ;;
    restart)
        restart_iptables
        ;;
    *)
        echo "Използвайте: $0 {start|stop|restart}"
        exit 1
esac

exit 0

Какво е if в Bash

Ето основния синтаксис на if в Bash:

Bash
if [ условие ]; then
  # Команди, които да се изпълнят, ако условието е истина
else
  # Команди, които да се изпълнят, ако условието е неистина
fi
  • [ условие ]: Това е израз, който се оценява. Ако резултатът от израза е истина (exit status 0), тогава се изпълняват командите след then. Ако е неистина (exit status различен от 0), се изпълняват командите след else.
  • then…fi: Този блок обозначава началото и края на командите, които трябва да се изпълнят, ако условието е истина или неистина.

Също така може да се използва elif за добавяне на допълнителни условия:

Bash
if [ условие1 ]; then
  # Команди, които да се изпълнят, ако условие1 е истина
elif [ условие2 ]; then
  # Команди, които да се изпълнят, ако условие2 е истина
else
  # Команди, които да се изпълнят, ако и двете условия са неистина
fi

Тук, elif представлява съкращение от “else if”, и се използва за проверка на множество условия по ред.

backup script архивиращ папка с днешния ден и изтриващ вчерашния

Ето пример за Bash скрипт, който архивира дадена папка, като добавя днешната дата към името на архива, и изтрива архива от предишния ден. Скриптът използва tar за създаване на архива и date командата за генериране на датите.

Bash
#!/bin/bash

# Директорията, която искате да архивирате
DIRECTORY_TO_BACKUP="/path/to/your/directory"

# Мястото, където ще се съхраняват архивите
BACKUP_DIRECTORY="/path/to/backup/directory"

# Формат на датата за името на файла (например 2023-11-20)
DATE_FORMAT="%Y-%m-%d"
TODAY=$(date +"$DATE_FORMAT")
YESTERDAY=$(date --date="yesterday" +"$DATE_FORMAT")

# Името на архивния файл
BACKUP_FILE="$BACKUP_DIRECTORY/backup-$TODAY.tar.gz"

# Създаване на архива
tar -czf "$BACKUP_FILE" "$DIRECTORY_TO_BACKUP"

# Проверка и изтриване на вчерашния архив, ако съществува
YESTERDAY_BACKUP_FILE="$BACKUP_DIRECTORY/backup-$YESTERDAY.tar.gz"
if [ -f "$YESTERDAY_BACKUP_FILE" ]; then
    rm "$YESTERDAY_BACKUP_FILE"
fi

echo "Backup for $TODAY completed. Yesterday's backup deleted."

За да използвате този скрипт:

  1. Заменете /path/to/your/directory с пътя към папката, която искате да архивирате.
  2. Заменете /path/to/backup/directory с пътя, където искате да съхранявате архивите.
  3. Запишете скрипта във файл, например daily_backup.sh.
  4. Направете файла изпълним: chmod +x daily_backup.sh.
  5. Изпълнете скрипта с ./daily_backup.sh.

Този скрипт ще създаде архив на избраната директория с текущата дата в името и ще изтрие архива от предишния ден, ако той съществува. Уверете се, че имате достатъчно място в директорията за архивиране и че директориите, посочени в скрипта, съществуват.

Скрипт извличащ информация за системата CPU, RAM,HDD, LAN

Създаването на Bash скрипт, който показва информация за натоварването на CPU, използването на RAM, процента на заетост на хард диска и трафика през LAN картата, може да бъде реализирано чрез комбиниране на различни системни команди. Ето примерен скрипт:

Bash
#!/bin/bash

# Получаване на информация за CPU натоварване
CPU_LOAD=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')

# Получаване на информация за използваната RAM
MEM_USAGE=$(free -m | awk 'NR==2{printf "%.2f%%\n", $3/$2 * 100}')

# Получаване на информация за заетостта на дисковото пространство
DISK_USAGE=$(df -h | awk '$NF=="/"{printf "%s\n", $5}')

# Получаване на информация за мрежовия трафик
# Забележка: Заменете eth0 с името на вашата мрежова интерфейсна карта
NET_TRAFFIC=$(cat /sys/class/net/eth0/statistics/rx_bytes)

echo "CPU Load: $CPU_LOAD%"
echo "RAM Usage: $MEM_USAGE"
echo "Disk Usage: $DISK_USAGE"
echo "Network Traffic (received bytes): $NET_TRAFFIC"

За да използвате този скрипт:

  1. Запишете го във файл, например system_info.sh.
  2. Дайте му права за изпълнение с командата chmod +x system_info.sh.
  3. Изпълнете скрипта с ./system_info.sh.

Уверете се, че заменяте eth0 с името на вашата мрежова карта. Можете да проверите името й с командата ip link.

Този скрипт предоставя базова информация. В зависимост от вашите нужди, може да се наложи да го модифицирате или разширите.

Цветове в bash скрипт

Основни ANSI Escape Кодове за Цветове

  • Цветове на текста:
    • Червен: \033[0;31m
    • Зелен: \033[0;32m
    • Жълт: \033[0;33m
    • Син: \033[0;34m
    • Лилав: \033[0;35m
    • Циан: \033[0;36m
    • Бял: \033[0;37m
  • Цветове на фона:
    • Червен: \033[0;41m
    • Зелен: \033[0;42m
    • Жълт: \033[0;43m
    • Син: \033[0;44m
    • Лилав: \033[0;45m
    • Циан: \033[0;46m
    • Бял: \033[0;47m
  • За да прекратите цветовото форматиране, използвайте:
    • Reset: \033[0m

Пример за Bash скрипт с цветове

Bash
#!/bin/bash

echo -e "\033[0;31mТова е червен текст.\033[0m"
echo -e "\033[0;32mТова е зелен текст.\033[0m"
echo -e "\033[0;33mТова е жълт текст.\033[0m"
echo -e "\033[0;34mТова е син текст.\033[0m"
echo -e "Текст без цвят."

В този скрипт:

  • echo -e позволява интерпретацията на escape кодовете.
  • \033[ е въведението на ANSI escape последователността.
  • Кодът за цвета следва (например, 0;31m за червен).
  • \033[0m се използва за връщане към стандартния цвят на текста.

Как изглежда това на моето Ubuntu Desktop:

Какво е while в Bash

Bash
while [ условие ]; do
  # Команди, които да се изпълнят
done
  • [ условие ]: Това е условие, което се проверява преди всяко изпълнение на цикъла. Ако условието е истина (true), цикълът продължава. Ако е лъжа (false), цикълът прекратява.
  • do…done: Този блок обозначава началото и края на командите, които ще се изпълняват всяка итерация на цикъла.

Например:

Bash
count=0
while [ $count -lt 10 ]; do
  echo "Броячът е на стойност $count"
  count=$((count+1))
done

Този скрипт ще отпечатва стойността на променливата count и ще я увеличава с 1 при всяка итерация, докато стойността ѝ не достигне 10.

Скрипт с цветове който следи състоянието на хостове

Ето един вариант на bash скрипт, който да проверява дали определени хостове са достъпни и да показва състоянието им в реално време. Състоянието на пинга се показва със зелен цвят, ако пингът е успешен, и с червен цвят, ако хостът не отговаря на пинг.

Bash
#!/bin/bash

hosts=("87.246.47.1" "itservice-bg.net" "host2.itservice-bg.net")

while true; do
  clear
  echo "Host Monitoring"
  echo "----------------"
  for host in "${hosts[@]}"; do
    ping -c 1 "$host" > /dev/null 2>&1
    if [ $? -eq 0 ]; then
      echo -e "$host \033[32m[PING OK]\033[0m"
    else
      echo -e "$host \033[31m[PING FAILED]\033[0m"
    fi
  done
  sleep 2
done

В този скрипт се използва командата ping -c 1 "$host" за изпращане на един ICMP пакет към определен хост. След това се използва проверка на кода на завършване на командата с $? за определяне на успешността на пинга. Ако кодът на завършване е 0, то пингът е успешен, в противен случай хостът не отговаря.

Скриптът използва цикъл while true за постоянна проверка на състоянието на хостовете и sleep 2 за забавяне на изпълнението на скрипта за 2 секунди между проверките. Командата clear се използва за почистване на екрана преди всяко обновяване на резултата.

Скрипт който проверява състоянието на DNS сървъри

Ето един вариант на bash скрипт, който да проверява дали DNS сървърите са достъпни и да показва състоянието им в реално време. Състоянието на DNS заявката се показва със зелен цвят, ако заявката е успешна, и с червен цвят, ако DNS сървърът не отговаря на заявката.

Bash
#!/bin/bash

dns_servers=("8.8.8.8" "1.1.1.1")

while true; do
  clear
  echo "DNS Server Monitoring"
  echo "---------------------"
  for dns_server in "${dns_servers[@]}"; do
    dig +short google.com @$dns_server > /dev/null 2>&1
    if [ $? -eq 0 ]; then
      echo -e "$dns_server \033[32m[DNS OK]\033[0m"
    else
      echo -e "$dns_server \033[31m[DNS FAILED]\033[0m"
    fi
  done
  sleep 2
done

В този скрипт се използва командата dig +short google.com @$dns_server за изпращане на DNS заявка за записа на Google към определен DNS сървър. След това се използва проверка на кода на завършване на командата с $? за определяне на успешността на DNS заявката. Ако кодът на завършване е 0, то заявката е успешна, в противен случай DNS сървърът не отговаря.

Скриптът използва цикъл while true за постоянна проверка на състоянието на DNS сървърите и sleep 2 за забавяне на изпълнението на скрипта за 2 секунди между проверките. Командата clear се използва за почистване на екрана преди всяко обновяване на резултата.

Проверка на порт 80 на WEB сървъри

Ето един вариант на скрипт на bash, който може да проверява порт 80 на указаните хостове за да проверява състоянието на web сървърите:

Bash
#!/bin/bash

hosts=("87.246.47.1" "itservice-bg.net" "host2.itservice-bg.net")

port=80

while true; do
    for host in "${hosts[@]}"; do
        if nc -w 5 -z "$host" "$port"; then
            echo -e "\e[32m$host is up\e[0m"
        else
            echo -e "\e[31m$host is down\e[0m"
        fi
    done
    sleep 10
done

Този скрипт използва командата nc за да провери дали порт 80 на всеки хост от списъка е достъпен. Ако е достъпен, скриптът показва съобщение “host is up” в зелено, в противен случай показва “host is down” в червено.

Скриптът ще продължи да проверява състоянието на хостовете в списъка винаги, като ще изчаква 10 секунди между всяко тестване. Можете да редактирате списъка на hosts за да добавите или премахнете хостове, които да се мониторират.

Проверка на NTP сървъри от списък запис на събития

Ето един bash скрипт, който проверява дали ntp сървърите от списъка във файла ntp_servers.txt отговарят на заявки. Скриптът извежда резултатите на екрана и запазва логовете във файлове със съответните имена на сървърите в папката ntp_logs/. Ако ntp сървърът отговори успешно, скриптът ще изведе “NTP server (IP адрес) [NTP OK]” и записва лог “ntp_servers_logs/IP_адрес.log” със съдържание “NTP OK”. Ако ntp сървърът не отговори успешно, скриптът ще изведе “NTP server (IP адрес) [NTP FAILED]” и записва лог “ntp_servers_logs/IP_адрес.log” със съдържание “NTP FAILED”.

Bash
#!/bin/bash

# Проверявани ntp сървъри
servers_file="ntp_servers.txt"

# Проверяваме всеки 10 секунди
sleep_time=10

# Създаваме папката за логовете, ако не съществува
logs_dir="ntp_servers_logs"
if [[ ! -d "$logs_dir" ]]; then
    mkdir "$logs_dir"
fi

while true; do
    while read -r server; do
        # Извличаме IP адреса на сървъра
        ip_address=$(dig +short "$server")

        # Проверяваме дали сървърът отговаря на заявка
        if ntpdate -q "$ip_address" > /dev/null 2>&1 ; then
            # NTP сървърът отговаря успешно
            echo "NTP server ($ip_address) [NTP OK]"
            echo "NTP OK" > "$logs_dir/$ip_address.log"
        else
            # NTP сървърът не отговаря успешно
            echo "NTP server ($ip_address) [NTP FAILED]"
            echo "NTP FAILED" > "$logs_dir/$ip_address.log"
        fi
    done < "$servers_file"
    sleep "$sleep_time"
done

Забележка: за да изпълните успешно този скрипт, трябва да имате инсталиран пакета ntpdate на вашия Linux сървър. Ако го нямате, можете да го инсталирате с командата sudo apt-get install ntpdate за Ubuntu/Debian базирани системи или с командата sudo yum install ntpdate за RedHat/Fedora базирани системи.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.