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