Shell скрипты
Полезные Shell скрипты для автоматизации системных задач.
Мониторинг системы
Проверка использования ресурсов
#!/bin/bash
# system-monitor.sh
echo "=== Мониторинг системы $(date) ==="
echo
# CPU использование
echo "CPU использование:"
top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4"%"}'
echo
# Память
echo "Использование памяти:"
free -h | awk 'NR==2{printf "Использовано: %s из %s (%.2f%%)\n", $3,$2,$3*100/$2 }'
echo
# Диск
echo "Использование диска:"
df -h | awk '$NF=="/"{printf "Корневой раздел: %s из %s (%s)\n", $3,$2,$5}'
echo
# Загрузка системы
echo "Средняя загрузка:"
uptime | awk -F'load average:' '{ print $2 }'
echo
# Топ процессов по CPU
echo "Топ 5 процессов по CPU:"
ps aux --sort=-%cpu | head -6
echo
# Топ процессов по памяти
echo "Топ 5 процессов по памяти:"
ps aux --sort=-%mem | head -6
Проверка статуса сервисов
#!/bin/bash
# check-services.sh
SERVICES=("nginx" "mysql" "php8.2-fpm" "redis-server")
echo "=== Проверка статуса сервисов ==="
echo
for service in "${SERVICES[@]}"; do
if systemctl is-active --quiet "$service"; then
echo "✓ $service - работает"
else
echo "✗ $service - не работает"
# Попытка перезапуска
echo " Попытка перезапуска $service..."
systemctl start "$service"
if systemctl is-active --quiet "$service"; then
echo " ✓ $service успешно перезапущен"
else
echo " ✗ Не удалось перезапустить $service"
fi
fi
done
echo
echo "=== Статус портов ==="
netstat -tuln | grep -E ':(80|443|22|3306|6379) '
Резервное копирование
Бэкап базы данных MySQL
#!/bin/bash
# mysql-backup.sh
# Конфигурация
DB_USER="backup_user"
DB_PASS="backup_password"
DB_HOST="localhost"
BACKUP_DIR="/var/backups/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=7
# Создание директории для бэкапов
mkdir -p "$BACKUP_DIR"
# Получение списка баз данных
DATABASES=$(mysql -u"$DB_USER" -p"$DB_PASS" -h"$DB_HOST" -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql|sys)")
echo "Начало резервного копирования баз данных..."
for db in $DATABASES; do
echo "Создание бэкапа базы данных: $db"
mysqldump -u"$DB_USER" -p"$DB_PASS" -h"$DB_HOST" \
--single-transaction \
--routines \
--triggers \
"$db" | gzip > "$BACKUP_DIR/${db}_${DATE}.sql.gz"
if [ $? -eq 0 ]; then
echo "✓ Бэкап $db создан успешно"
else
echo "✗ Ошибка при создании бэкапа $db"
fi
done
# Удаление старых бэкапов
echo "Удаление бэкапов старше $RETENTION_DAYS дней..."
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete
echo "Резервное копирование завершено"
Бэкап файлов
#!/bin/bash
# files-backup.sh
# Конфигурация
SOURCE_DIRS=("/var/www" "/etc/nginx" "/etc/php" "/home/user/important")
BACKUP_DIR="/var/backups/files"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=30
# Создание директории для бэкапов
mkdir -p "$BACKUP_DIR"
echo "Начало резервного копирования файлов..."
for dir in "${SOURCE_DIRS[@]}"; do
if [ -d "$dir" ]; then
dir_name=$(basename "$dir")
echo "Создание архива: $dir"
tar -czf "$BACKUP_DIR/${dir_name}_${DATE}.tar.gz" -C "$(dirname "$dir")" "$(basename "$dir")" 2>/dev/null
if [ $? -eq 0 ]; then
echo "✓ Архив $dir создан успешно"
else
echo "✗ Ошибка при создании архива $dir"
fi
else
echo "⚠ Директория $dir не найдена"
fi
done
# Удаление старых архивов
echo "Удаление архивов старше $RETENTION_DAYS дней..."
find "$BACKUP_DIR" -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete
echo "Резервное копирование файлов завершено"
Установка и настройка
Автоматическая установка LAMP
#!/bin/bash
# install-lamp.sh
echo "Установка LAMP стека..."
# Обновление системы
apt update && apt upgrade -y
# Установка Apache
echo "Установка Apache..."
apt install -y apache2
systemctl enable apache2
systemctl start apache2
# Установка MySQL
echo "Установка MySQL..."
apt install -y mysql-server
mysql_secure_installation
# Установка PHP
echo "Установка PHP..."
apt install -y php libapache2-mod-php php-mysql php-curl php-gd php-zip php-xml php-mbstring
# Настройка PHP
sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 50M/' /etc/php/*/apache2/php.ini
sed -i 's/post_max_size = 8M/post_max_size = 50M/' /etc/php/*/apache2/php.ini
sed -i 's/max_execution_time = 30/max_execution_time = 300/' /etc/php/*/apache2/php.ini
# Перезапуск Apache
systemctl restart apache2
# Установка phpMyAdmin
echo "Установка phpMyAdmin..."
apt install -y phpmyadmin
# Создание тестового файла
echo "<?php phpinfo(); ?>" > /var/www/html/info.php
echo "LAMP стек установлен успешно!"
echo "Тестовая страница PHP: http://$(hostname -I | awk '{print $1}')/info.php"
Настройка файрвола
#!/bin/bash
# setup-firewall.sh
echo "Настройка UFW файрвола..."
# Сброс правил
ufw --force reset
# Политики по умолчанию
ufw default deny incoming
ufw default allow outgoing
# Разрешенные порты
ufw allow ssh
ufw allow 80/tcp
ufw allow 443/tcp
# Разрешение для конкретных IP (опционально)
# ufw allow from 192.168.1.0/24 to any port 22
# Включение UFW
ufw --force enable
# Статус
ufw status verbose
echo "Файрвол настроен!"
Обслуживание
Очистка системы
#!/bin/bash
# system-cleanup.sh
echo "Очистка системы..."
# Очистка кэша пакетов
echo "Очистка кэша пакетов..."
apt autoremove -y
apt autoclean
apt clean
# Очистка логов старше 7 дней
echo "Очистка старых логов..."
journalctl --vacuum-time=7d
# Очистка временных файлов
echo "Очистка временных файлов..."
find /tmp -type f -atime +7 -delete 2>/dev/null
find /var/tmp -type f -atime +7 -delete 2>/dev/null
# Очистка кэша браузеров (для пользователей)
echo "Очистка кэша пользователей..."
find /home -name ".cache" -type d -exec rm -rf {}/chromium {}/mozilla {}/thumbnails \; 2>/dev/null
# Анализ использования диска после очистки
echo "Использование диска после очистки:"
df -h /
echo "Очистка системы завершена!"
Проверка безопасности
#!/bin/bash
# security-check.sh
echo "=== Проверка безопасности системы ==="
echo
# Проверка последних входов
echo "Последние входы в систему:"
last -n 10
echo
# Проверка неудачных попыток входа
echo "Неудачные попытки входа:"
grep "Failed password" /var/log/auth.log | tail -10
echo
# Проверка активных подключений
echo "Активные SSH подключения:"
ss -tuln | grep :22
echo
# Проверка открытых портов
echo "Открытые порты:"
ss -tuln
echo
# Проверка обновлений безопасности
echo "Доступные обновления безопасности:"
apt list --upgradable 2>/dev/null | grep -i security
echo
# Проверка прав доступа к критичным файлам
echo "Проверка прав доступа:"
ls -la /etc/passwd /etc/shadow /etc/sudo* 2>/dev/null
echo
# Проверка cron задач root
echo "Cron задачи root:"
crontab -l 2>/dev/null || echo "Нет cron задач для root"
Автоматизация задач
Cron скрипт для обслуживания
#!/bin/bash
# maintenance.sh
LOG_FILE="/var/log/maintenance.log"
{
echo "=== Обслуживание системы $(date) ==="
# Обновление системы
apt update > /dev/null 2>&1
UPDATES=$(apt list --upgradable 2>/dev/null | wc -l)
echo "Доступно обновлений: $((UPDATES-1))"
# Проверка места на диске
DISK_USAGE=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
echo "Использование диска: $DISK_USAGE%"
if [ $DISK_USAGE -gt 80 ]; then
echo "ВНИМАНИЕ: Диск заполнен более чем на 80%"
fi
# Проверка памяти
MEM_USAGE=$(free | awk 'NR==2{printf "%.2f", $3*100/$2}')
echo "Использование памяти: $MEM_USAGE%"
# Проверка загрузки
LOAD_AVG=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}' | sed 's/,//')
echo "Средняя загрузка: $LOAD_AVG"
echo "=== Обслуживание завершено ==="
echo
} >> "$LOG_FILE"
Скрипт мониторинга веб-сайта
#!/bin/bash
# website-monitor.sh
SITES=("https://example.com" "https://api.example.com")
LOG_FILE="/var/log/website-monitor.log"
for site in "${SITES[@]}"; do
response=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 "$site")
if [ "$response" = "200" ]; then
status="OK"
else
status="ERROR (HTTP: $response)"
# Отправка уведомления (можно добавить email/slack)
echo "$(date): $site недоступен - $status" >> "$LOG_FILE"
fi
echo "$(date): $site - $status" >> "$LOG_FILE"
done
Автоматизация
Добавьте скрипты в cron для регулярного выполнения. Например: 0 2 * * * /path/to/backup.sh
для ежедневного бэкапа в 2:00.
Безопасность
Храните скрипты в защищенной директории с правами 700 и используйте переменные окружения для паролей.