Какво е Bash
Bash (Bourne Again SHell) е команден интерпретатор за операционните системи от типа Unix, включително Linux. Той представлява усъвършенствана версия на оригиналния Bourne Shell (sh
), разработен от Стивън Борн в AT&T Bell Labs. Bash е стандартен команден интерпретатор в повечето дистрибуции на Linux и macOS, и е известен със своите мощни възможности за програмиране на скриптове, включително:
- Поддръжка на променливи, цикли и условни изрази.
- Възможност за редиректиране на входа и изхода (input/output redirection).
- Вградени команди за обработка на текстови файлове и данни.
- Способност за изпълнение на команди и скриптове, записани във файл.
- Интерактивен интерфейс, който позволява на потребителите да въвеждат и изпълняват команди директно.
Bash е много популярен сред системните администратори, разработчици и ентусиасти на Linux поради неговата гъвкавост и широка поддръжка.
Linux команди в Bash
Linux командите в Bash са инструкции, които могат да бъдат въведени в командния ред (терминал) на системи, базирани на Unix, като Linux, за да извършват различни операции. Тези команди могат да бъдат прости, изпълняващи една задача, или сложни, съчетаващи няколко функции. Ето няколко ключови аспекта на Linux командите в Bash:
- Основни команди: Това са прости команди, като
ls
за изброяване на файлове в директория,cd
за промяна на текущата директория,cp
за копиране на файлове,mv
за преместване или преименуване на файлове,rm
за изтриване на файлове, и т.н. - Филтриращи и обработващи текст команди: Команди като
grep
за търсене на текст,sort
за сортиране на редове в текст,awk
иsed
за сложна обработка на текстови данни. - Работа с мрежата: Команди като
ping
за проверка на мрежова връзка,ssh
за отдалечен достъп до други системи,scp
за копиране на файлове през мрежата. - Управление на системата и процесите: Команди като
top
за преглед на активните процеси,ps
за изброяване на текущите процеси,kill
за прекратяване на процеси. - Работа с диска и файловата система: Команди като
df
за проверка на свободното дисково пространство,du
за измерване на дисковото пространство, заето от файлове и директории. - Персонализация и скриптове: Bash също позволява на потребителите да пишат скриптове, които са последователности от команди, за автоматизиране на задачи.
- Помощ и информация: Команди като
man
иinfo
предоставят помощна информация и документация за други команди.
Всички тези команди и техните опции помагат на потребителите да управляват и контролират своята Linux система ефективно, да автоматизират задачи и да обработват данни по гъвкав и мощен начин.
Какво е pipe в bash
В Bash и други Unix-подобни операционни системи, “pipe” (означава се със символа |
) е мощна функция, която позволява изходните данни (output) от една команда да бъдат използвани като входни данни (input) за друга команда. Това е форма на междупроцесна комуникация и е често използван метод за свързване на множество команди в единна командна поредица.
Ето пример как pipe се използва в Bash:
command1 | command2 | command3
В този пример:
command1
се изпълнява и нейният стандартен изход (стандартен output) се подава къмcommand2
.command2
обработва данните, получени отcommand1
, и изпраща своя изход къмcommand3
.command3
получава изхода отcommand2
и извършва своята функция.
Този метод е особено полезен за обработка на текстови данни, филтриране на резултати, анализ на логове и други подобни задачи. Той позволява на потребителя да комбинира множество прости команди, за да изгради сложни операции обработка на данни.
Променливи в Bash
Променливите в Bash са именовани обекти, които съхраняват стойности, които могат да бъдат текст, числа, пътища до файлове или други типове данни. Работата с променливи е основен аспект от програмирането в Bash и е важна за управлението на данни и конфигурацията на средата. Ето основните концепции за работа с променливи в Bash:
- Деклариране на променливи: За да създадете променлива в Bash, просто я назначете без да използвате интервал. Например:
myvariable="Hello, World!"
. - Използване на променливи: За да използвате стойността на променлива, използвайте
$
пред името на променливата. Например:echo $myvariable
ще отпечата “Hello, World!”. - Експортиране на променливи: Променливите по подразбиране са локални за текущата обвивка (shell). За да ги направите достъпни за дъщерните процеси, използвайте командата
export
:export myvariable
. - Специални променливи: Bash предоставя редица специални променливи, като
$PATH
,$HOME
и$USER
, които съдържат важна системна информация. - Променливи на средата: Това са глобални променливи, които влияят на поведението на обвивката и на други програми, изпълнявани от обвивката.
- Позиционни променливи: В Bash скриптовете,
$1
,$2
,$3
, и т.н., представляват аргументите, подадени на скрипта. - Използване на кавички: Двойните кавички (
"
) позволяват интерпретирането на променливите вътре в тях, докато единичните кавички ('
) не го позволяват. Например:echo "$myvariable"
иecho '$myvariable'
ще дадат различни резултати. - Съхраняване на командни резултати в променливи: Можете да запишете изхода от команда в променлива, използвайки
$(command)
синтаксиса. Например:today=$(date)
.
Тези основни принципи на работа с променливи в Bash предоставят гъвкави възможности за управление на данни и контрол на поведението на скриптовете и обвивката.
Какво е echo в Bash
В Bash, командата echo
се използва за отпечатване на текст на стандартния изход, което обикновено означава конзолата или терминала. Тази команда е често използвана за показване на низове, стойности на променливи или за създаване на текстови файлове.
Ето няколко основни примера за използването на echo
:
- Отпечатване на прост текст:
echo "Здравей, свят!"
Тази команда ще отпечата “Здравей, свят!” на екрана.
Използване на променливи:
приветствие="Здравей, свят!"
echo $приветствие
Тук, echo
ще отпечата стойността на променливата приветствие
.
Създаване на файлове с определено съдържание:
echo "Някакъв текст" > файл.txt
Тази команда ще създаде файл с име файл.txt
, съдържащ текста “Някакъв текст”.
Добавяне на текст към съществуващ файл:
echo "Допълнителен текст" >> файл.txt
Това ще добави “Допълнителен текст” към края на файл.txt
, без да изтрива съществуващото съдържание.
Отпечатване на специални символи: За да се отпечатат специални символи (като нов ред или табулация), се използват ескейп-секвенции. Например, \n
за нов ред и \t
за табулация:
echo -e "Първи ред\nВтори ред"
- Опцията
-e
позволява интерпретирането на тези ескейп-секвенции.
echo
е многофункционална и широко използвана команда в Bash скриптовете за показване на информация, диагностика на скриптове и манипулиране на текстови данни.
Пример за Bash скрипт с “start|stop|restart”
Един примерен Bash скрипт, който обработва командите “start”, “stop” и “restart”, може да изглежда така:
#!/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
, която искате да управлявате.
#!/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 е контролна структура, която се използва за изпълнение на определени команди в зависимост от това дали дадено условие е изпълнено (истина) или не (неистина). Структурата if
изпълнява различни секции от кода в зависимост от резултатите на тестове или проверки.
Ето основния синтаксис на if
в Bash:
if [ условие ]; then
# Команди, които да се изпълнят, ако условието е истина
else
# Команди, които да се изпълнят, ако условието е неистина
fi
- [ условие ]: Това е израз, който се оценява. Ако резултатът от израза е истина (exit status 0), тогава се изпълняват командите след
then
. Ако е неистина (exit status различен от 0), се изпълняват командите следelse
. - then…fi: Този блок обозначава началото и края на командите, които трябва да се изпълнят, ако условието е истина или неистина.
Също така може да се използва elif
за добавяне на допълнителни условия:
if [ условие1 ]; then
# Команди, които да се изпълнят, ако условие1 е истина
elif [ условие2 ]; then
# Команди, които да се изпълнят, ако условие2 е истина
else
# Команди, които да се изпълнят, ако и двете условия са неистина
fi
Тук, elif
представлява съкращение от “else if”, и се използва за проверка на множество условия по ред.
backup script архивиращ папка с днешния ден и изтриващ вчерашния
Ето пример за Bash скрипт, който архивира дадена папка, като добавя днешната дата към името на архива, и изтрива архива от предишния ден. Скриптът използва tar
за създаване на архива и date
командата за генериране на датите.
#!/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."
За да използвате този скрипт:
- Заменете
/path/to/your/directory
с пътя към папката, която искате да архивирате. - Заменете
/path/to/backup/directory
с пътя, където искате да съхранявате архивите. - Запишете скрипта във файл, например
daily_backup.sh
. - Направете файла изпълним:
chmod +x daily_backup.sh
. - Изпълнете скрипта с
./daily_backup.sh
.
Този скрипт ще създаде архив на избраната директория с текущата дата в името и ще изтрие архива от предишния ден, ако той съществува. Уверете се, че имате достатъчно място в директорията за архивиране и че директориите, посочени в скрипта, съществуват.
Скрипт извличащ информация за системата CPU, RAM,HDD, LAN
Създаването на Bash скрипт, който показва информация за натоварването на CPU, използването на RAM, процента на заетост на хард диска и трафика през LAN картата, може да бъде реализирано чрез комбиниране на различни системни команди. Ето примерен скрипт:
#!/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"
За да използвате този скрипт:
- Запишете го във файл, например
system_info.sh
. - Дайте му права за изпълнение с командата
chmod +x system_info.sh
. - Изпълнете скрипта с
./system_info.sh
.
Уверете се, че заменяте eth0
с името на вашата мрежова карта. Можете да проверите името й с командата ip link
.
Този скрипт предоставя базова информация. В зависимост от вашите нужди, може да се наложи да го модифицирате или разширите.
Цветове в bash скрипт
За да добавите цветове в Bash скрипт за по-добра четимост, можете да използвате ANSI escape кодове. Тези кодове ви позволяват да променяте цвета на текста и фона в терминала. Ето основен пример как да използвате тези кодове:
Основни 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
- Reset:
Пример за 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
Командата while
в Bash е циклична структура, която позволява изпълнението на даден блок от команди многократно, докато определено условие остава истина (true). Синтаксисът на while
е прост и позволява лесно изпълнение на повтарящи се задачи в скриптове. Ето основния формат:
while [ условие ]; do
# Команди, които да се изпълнят
done
- [ условие ]: Това е условие, което се проверява преди всяко изпълнение на цикъла. Ако условието е истина (true), цикълът продължава. Ако е лъжа (false), цикълът прекратява.
- do…done: Този блок обозначава началото и края на командите, които ще се изпълняват всяка итерация на цикъла.
Например:
count=0
while [ $count -lt 10 ]; do
echo "Броячът е на стойност $count"
count=$((count+1))
done
Този скрипт ще отпечатва стойността на променливата count
и ще я увеличава с 1 при всяка итерация, докато стойността ѝ не достигне 10.
Скрипт с цветове който следи състоянието на хостове
Ето един вариант на 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 сървърът не отговаря на заявката.
#!/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 сървърите:
#!/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”.
#!/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 базирани системи.