Блог "Дети ОИТа"
/поиск

Bash-скрипты для администраторов: автоматизация рутины

Практическое руководство по написанию Bash-скриптов для автоматизации рутинных задач системного администратора Linux: мониторинг, бэкапы, ротация логов, управление пользователями.

Bash-скрипты для администраторов: автоматизация рутины

Введение

Системное администрирование Linux сопряжено с множеством повторяющихся задач: ротация логов, резервное копирование, мониторинг дискового пространства, управление пользователями. Bash — мощный инструмент для автоматизации этих процессов. В данном руководстве собраны практические скрипты для ежедневных задач администратора.

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

Скрипт проверяет заполнение разделов и отправляет алерт при превышении порога.

#!/bin/bash

# Порог в процентах
THRESHOLD=85

# Проверяем все смонтированные разделы
df -h | awk 'NR>1 {print $5" "$6}' | while read output; do
    usep=$(echo "$output" | awk '{print $1}' | sed 's/%//')
    partition=$(echo "$output" | awk '{print $2}')
    
    if [ "$usep" -ge "$THRESHOLD" ]; then
        echo "ПРЕДУПРЕЖДЕНИЕ: Раздел $partition заполнен на ${usep}%" | logger -t disk_monitor
        echo "ПРЕДУПРЕЖДЕНИЕ: Раздел $partition заполнен на ${usep}%" | mail -s "Disk Alert: $partition" admin@company.local
    fi
done

Особенности:

  • Использует df -h для человекочитаемого вывода
  • Отправляет уведомление в syslog и email
  • Легко настраивается через переменную THRESHOLD

2. Ротация и архивация логов

#!/bin/bash

LOG_DIR="/var/log/app"
ARCHIVE_DIR="/var/log/archive"
RETENTION_DAYS=30

# Создаём директорию архива при необходимости
mkdir -p "$ARCHIVE_DIR"

# Архивируем логи старше 1 дня
find "$LOG_DIR" -name "*.log" -mtime +1 -exec gzip {} \;

# Перемещаем архивы
mv "$LOG_DIR"/*.gz "$ARCHIVE_DIR/" 2>/dev/null

# Удаляем старые архивы
find "$ARCHIVE_DIR" -name "*.gz" -mtime +$RETENTION_DAYS -delete

# Проверяем успешность
if [ $? -eq 0 ]; then
    echo "$(date): Ротация логов завершена успешно" >> /var/log/maintenance.log
else
    echo "$(date): ОШИБКА ротации логов" >> /var/log/maintenance.log
    logger -t logrotate "Ошибка ротации логов"
fi

3. Резервное копирование с шифрованием

#!/bin/bash

SOURCE_DIR="/home/data"
BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d_%H%M%S)
PASSPHRASE="your-strong-passphrase-here"

# Создаём архив с шифрованием
tar -czf - "$SOURCE_DIR" | gpg --symmetric --cipher-algo AES256 --passphrase "$PASSPHRASE" > "$BACKUP_DIR/backup_$DATE.tar.gz.gpg"

# Проверяем размер бэкапа
SIZE=$(du -h "$BACKUP_DIR/backup_$DATE.tar.gz.gpg" | cut -f1)

if [ -s "$BACKUP_DIR/backup_$DATE.tar.gz.gpg" ]; then
    echo "Бэкап создан: $SIZE" | logger -t backup
else
    echo "ОШИБКА: бэкап не создан" | logger -t backup -p err
    exit 1
fi

# Удаляем бэкапы старше 7 дней
find "$BACKUP_DIR" -name "backup_*.tar.gz.gpg" -mtime +7 -delete

4. Управление пользователями: блокировка неактивных

#!/bin/bash

INACTIVE_DAYS=30
LOG_FILE="/var/log/user_audit.log"

# Находим пользователей, не входивших более INACTIVE_DAYS
lastlog -b "$INACTIVE_DAYS" | awk 'NR>1 && $1 != "Never" {print $1}' | while read user; do
    # Блокируем пользователя
    usermod -L "$user"
    
    # Устанавливаем shell на nologin
    usermod -s /sbin/nologin "$user"
    
    echo "$(date): Пользователь $user заблокирован из-за неактивности" >> "$LOG_FILE"
    logger -t user_audit "Блокировка неактивного пользователя: $user"
done

5. Проверка целостности критических файлов

#!/bin/bash

# Файл с хешами (должен быть защищён)
HASHES_FILE="/etc/secure/hashes.sha256"
LOG_FILE="/var/log/integrity_check.log"

if [ ! -f "$HASHES_FILE" ]; then
    echo "Файл хешей не найден. Создаём базовую линию..."
    mkdir -p /etc/secure
    find /etc /usr/bin /usr/sbin -type f -exec sha256sum {} \; > "$HASHES_FILE"
    chmod 600 "$HASHES_FILE"
    exit 0
fi

# Проверяем целостность
sha256sum -c "$HASHES_FILE" > "$LOG_FILE" 2>&1

# Ищем несоответствия
if grep -q "FAILED" "$LOG_FILE"; then
    logger -t integrity "Обнаружены изменения в критических файлах"
    mail -s "Integrity Alert" admin@company.local < "$LOG_FILE"
else
    logger -t integrity "Проверка целостности пройдена"
fi

Best Practices

  1. Используйте set -euo pipefail в начале скриптов:

    #!/bin/bash
    set -euo pipefail
    
  2. Логируйте всё — используйте logger для syslog

  3. Никогда не храните пароли в скриптах — используйте vault или переменные окружения

  4. Проверяйте коды возврата после каждой критичной команды

  5. Добавляйте --dry-run для опасных операций

  6. Используйте полные пути к бинарникам в production-скриптах

Развёртывание

# Копируем скрипты
cp scripts/* /usr/local/sbin/
chmod +x /usr/local/sbin/*

# Добавляем в crontab (пример)
# Ежедневная проверка диска в 2:00
0 2 * * * /usr/local/sbin/monitor_disk.sh

# Еженедельная ротация логов в воскресенье 3:00
0 3 * * 0 /usr/local/sbin/rotate_logs.sh

# Ежедневный бэкап в 1:30
30 1 * * * /usr/local/sbin/backup.sh

# Еженедельная проверка целостности в субботу 4:00
0 4 * * 6 /usr/local/sbin/integrity_check.sh

Заключение

Автоматизация — ключ к эффективному администрированию. Данные скрипты покрывают 80% рутинных задач. Адаптируйте их под вашу инфраструктуру и дополняйте по мере необходимости.


Категории: Администрирование Linux, Автоматизация

Теги: #bash #автоматизация #администрирование #скрипты #Linux #backup #monitoring #security