Skip to main content

Bash скрипты

Шаг 1: Создание файла скрипта

Создайте файл с расширением .sh. Первая строка всегда должна быть "shebang" — #!/bin/bash. Он указывает системе, какой интерпретатор использовать для выполнения скрипта.

#!/bin/bash
#Это комментарий
echo "Привет, мир!"

Шаг 2: Предоставление прав на выполнение

По умолчанию текстовый файл не является исполняемым. Используйте команду chmod +x, чтобы это исправить.

chmod +x my_script.sh

Шаг 3: Запуск скрипта

Для запуска укажите путь к файлу. Если вы находитесь в том же каталоге, используйте ./.

./my_script.sh

Автоматизация с помощью Cron

Cron — это планировщик задач. Для редактирования задач текущего пользователя используется команда crontab -e. Каждая строка имеет формат: МИНУТА ЧАС ДЕНЬ_МЕСЯЦА МЕСЯЦ ДЕНЬ_НЕДЕЛИ /путь/к/команде.

  • * * * * * — Каждую минуту.
  • 0 * * * * — Каждый час, в 00 минут.
  • 0 */4 * * * — Каждые 4 часа.
  • 5 3 * * * — Каждый день, в 3:05 ночи.
  • 0 4 * * 0 — Каждое воскресенье, в 4:00 утра (0 - воскресенье).

Пример записи для выполнения скрипта ежедневно в 2:30 ночи:

30 2 * * * /home/user/scripts/backup.sh >/dev/null 2>&1

Часть >/dev/null 2>&1 перенаправляет весь вывод (стандартный и ошибки) в "никуда", чтобы cron не отправлял вам письма по каждому запуску.

Практические шаблоны скриптов

1. Резервное копирование каталога

Создает .tar.gz архив указанного каталога с датой в имени файла. Идеально для ежедневного бэкапа сайтов или важных документов.

#!/bin/bash
#Каталог, который нужно архивировать
SOURCE_DIR="/var/www/my-site"
# Каталог для хранения бэкапов
BACKUP_DIR="/mnt/backups/sites"
# Имя файла бэкапа с датой
BACKUP_FILENAME="my-site_$(date +%Y-%m-%d).tar.gz"
#Создание архива
tar -czf "$BACKUP_DIR/$BACKUP_FILENAME" -C "$(dirname "$SOURCE_DIR")" "$(basename "$SOURCE_DIR")"
echo "Бэкап $BACKUP_FILENAME успешно создан."

2. Мониторинг дискового пространства

Проверяет использование диска в указанном разделе. Если использование превышает порог, отправляет письмо на почту.

#!/bin/bash
#Порог в процентах
THRESHOLD=90
#Раздел для проверки
PARTITION="/"
#Email для оповещений
ADMIN_EMAIL="admin@example.com"
#Получаем текущее использование в процентах (без знака %)
CURRENT_USAGE=$(df "$PARTITION" | grep -v Filesystem | awk '{print $5}' | sed 's/%//g')
if [ "$CURRENT_USAGE" -gt "$THRESHOLD" ]; then
  echo "ВНИМАНИЕ: На сервере $(hostname) заканчивается место на диске ($PARTITION). Занято: $CURRENT_USAGE%." | mail -s "Disk Space Alert" "$ADMIN_EMAIL"
fi

3. Проверка и перезапуск сервиса

Проверяет, активен ли указанный сервис (например, nginx). Если нет, пытается его перезапустить и отправляет уведомление.

#!/bin/bash
SERVICE_NAME="nginx"
ADMIN_EMAIL="admin@example.com"
if ! systemctl is-active --quiet "$SERVICE_NAME"; then
    echo "Сервис $SERVICE_NAME не активен! Попытка перезапуска..."
    systemctl restart "$SERVICE_NAME"
    sleep 2
    if systemctl is-active --quiet "$SERVICE_NAME"; then
        echo "Сервис $SERVICE_NAME успешно перезапущен." | mail -s "Service Restart: $SERVICE_NAME" "$ADMIN_EMAIL"
    else
        echo "НЕ УДАЛОСЬ перезапустить сервис $SERVICE_NAME!" | mail -s "CRITICAL: Service Down: $SERVICE_NAME" "$ADMIN_EMAIL"
    fi
fi

4. Очистка старых лог-файлов

Находит и удаляет файлы, которые не изменялись более N дней в указанном каталоге. Помогает освободить место.

#!/bin/bash
#Каталог с логами
LOG_DIR="/var/log/my_app"
#Удалять файлы старше N дней
DAYS=30
find "$LOG_DIR" -type f -name "*.log" -mtime +"$DAYS" -delete
echo "Старые логи в $LOG_DIR удалены."

5. Уведомление о смене публичного IP

Полезно для домашних серверов с динамическим IP. Скрипт проверяет текущий IP и, если он изменился с последнего запуска, отправляет новый IP на почту.

#!/bin/bash
#Файл для хранения последнего известного IP
IP_FILE="/home/user/.last_ip"
ADMIN_EMAIL="myemail@example.com"
#Получаем текущий IP
CURRENT_IP=$(curl -s ifconfig.me)
if [ ! -f "$IP_FILE" ]; then
    echo "$CURRENT_IP" > "$IP_FILE"
fi
LAST_IP=$(cat "$IP_FILE")

if [ "$CURRENT_IP" != "$LAST_IP" ]; then echo "Новый IP-адрес: $CURRENT_IP" | mail -s "IP Address Changed" "$ADMIN_EMAIL" echo "$CURRENT_IP" > "$IP_FILE" fi

6. Аудит успешных входов по SSH

Отправляет на почту список последних успешных входов по SSH. Помогает отслеживать, кто и когда заходил на сервер.

#!/bin/bash
ADMIN_EMAIL="security@example.com"
(echo "Последние 10 успешных входов по SSH на $(hostname):"; echo; last -n 10) | mail -s "SSH Login Audit" "$ADMIN_EMAIL"

7. Создание "снимка" состояния системы

Собирает основную информацию о состоянии системы (нагрузка, память, диск) и сохраняет в лог-файл. Полезно для ретроспективного анализа проблем.

#!/bin/bash
SNAPSHOT_FILE="/var/log/system_snapshots.log"
{ 
    echo "====== SNAPSHOT $(date) ======";
    echo "--- Uptime & Load Average ---";
    uptime;
    echo;
    echo "--- Memory Usage (MB) ---";
    free -m;
    echo;
    echo "--- Disk Usage ---";
    df -h;
    echo "====================================\n";
} >> "$SNAPSHOT_FILE"

8. Массовое переименование файлов

Пример: заменяет пробелы на знаки подчеркивания во всех именах файлов в текущем каталоге. Исправлено для предотвращения перезаписи существующих файлов.

#!/bin/bash
#Перебираем все файлы и папки в текущем каталоге
for file in *; do
    # Проверяем, есть ли пробелы в имени
    if [[ "$file" == *" "* ]]; then
        # Заменяем пробелы на подчеркивания
        new_name=$(echo "$file" | tr ' ' '_')
        # ПРОВЕРКА: не перезаписать существующий файл
        if [ ! -e "$new_name" ]; then
            mv "$file" "$new_name"
            echo "Переименовано: '$file' -> '$new_name'\n"
        else
            echo "ОШИБКА: Файл '$new_name' уже существует. Пропуск '$file'.\n"
        fi
    fi
done

9. Безопасное уведомление об обновлениях

Вместо рискованного авто-обновления, этот скрипт проверяет наличие доступных обновлений и отправляет их список администратору на почту. Это позволяет принять взвешенное решение об обновлении вручную.

#!/bin/bash
ADMIN_EMAIL="admin@example.com"
#Обновляем список пакетов в тихом режиме
apt-get update > /dev/null
#Получаем список пакетов, доступных для обновления
UPGRADABLE=$(apt-get -s upgrade | awk '/^Inst/ {print $2}')
if [ -n "$UPGRADABLE" ]; then
    (echo "На сервере $(hostname) доступны следующие обновления:"; echo; echo "$UPGRADABLE") | mail -s "System Updates Available" "$ADMIN_EMAIL"
fi