Базовые примеры для начинающего админа
1. Проверка запуска системы после обновления
bash
#!/bin/bash
# check_reboot_needed.sh - проверка, требуется ли перезагрузка
# Проверяем, существует ли файл /var/run/reboot-required
if [ -f /var/run/reboot-required ]; then
echo "⚠️ ТРЕБУЕТСЯ ПЕРЕЗАГРУЗКА СИСТЕМЫ!"
echo "Причина: $(cat /var/run/reboot-required.pkgs 2>/dev/null || echo 'обновление ядра')"
# Спрашиваем пользователя
read -p "Перезагрузить сейчас? (y/N): " answer
if [ "$answer" = "y" ] || [ "$answer" = "Y" ]; then
echo "Начинаю перезагрузку через 10 секунд..."
sleep 10
shutdown -r now
else
echo "Не забудьте перезагрузить систему позже!"
fi
else
echo "✅ Перезагрузка не требуется"
fi
2. Мониторинг пользователей в системе
bash
#!/bin/bash
# user_monitor.sh - мониторинг активности пользователей
echo "=== АКТИВНЫЕ ПОЛЬЗОВАТЕЛИ ==="
who
echo -e "\n=== ПОСЛЕДНИЙ ЛОГИН КАЖДОГО ПОЛЬЗОВАТЕЛЯ ==="
lastlog | grep -v "Never logged in"
echo -e "\n=== КОЛИЧЕСТВО ПОЛЬЗОВАТЕЛЕЙ ==="
TOTAL_USERS=$(cut -d: -f1 /etc/passwd | wc -l)
ACTIVE_USERS=$(who | wc -l)
echo "Всего пользователей в системе: $TOTAL_USERS"
echo "Сейчас активно: $ACTIVE_USERS"
# Проверяем, нет ли подозрительной активности
if [ "$ACTIVE_USERS" -gt 10 ]; then
echo "⚠️ Предупреждение: много активных пользователей ($ACTIVE_USERS)"
fi
# Проверяем root-логины
ROOT_LOGINS=$(last root | head -5)
if [ -n "$ROOT_LOGINS" ]; then
echo -e "\n=== ПОСЛЕДНИЕ ЛОГИНЫ ROOT ==="
echo "$ROOT_LOGINS"
fi
3. Проверка обновлений безопасности
bash
#!/bin/bash
# security_updates.sh - проверка обновлений безопасности
echo "Проверяю обновления безопасности..."
# Для Debian/Ubuntu
if [ -f /etc/debian_version ]; then
apt-get update > /dev/null 2>&1
# Ищем обновления безопасности
SECURITY_UPDATES=$(apt list --upgradable 2>/dev/null | grep -i security | wc -l)
if [ "$SECURITY_UPDATES" -gt 0 ]; then
echo "🚨 Найдено обновлений безопасности: $SECURITY_UPDATES"
echo "Список обновлений безопасности:"
apt list --upgradable 2>/dev/null | grep -i security
read -p "Установить обновления? (y/N): " answer
if [ "$answer" = "y" ] || [ "$answer" = "Y" ]; then
apt-get upgrade --only-upgrade -y
fi
else
echo "✅ Обновлений безопасности не найдено"
fi
else
echo "Это не Debian/Ubuntu система"
fi
4. Ротация логов с проверкой места
bash
#!/bin/bash
# simple_log_rotate.sh - простая ротация логов
LOG_FILE="/var/log/myapp/app.log"
MAX_SIZE_MB=100 # Максимальный размер файла в MB
BACKUP_DIR="/var/log/myapp/backup"
# Создаем backup директорию, если нет
if [ ! -d "$BACKUP_DIR" ]; then
mkdir -p "$BACKUP_DIR"
echo "Создана директория для бэкапов: $BACKUP_DIR"
fi
# Проверяем размер лог-файла
if [ -f "$LOG_FILE" ]; then
FILE_SIZE_MB=$(du -m "$LOG_FILE" | cut -f1)
if [ "$FILE_SIZE_MB" -ge "$MAX_SIZE_MB" ]; then
echo "Лог-файл достиг размера ${FILE_SIZE_MB}MB (лимит: ${MAX_SIZE_MB}MB)"
# Создаем backup с датой
BACKUP_NAME="app_$(date +%Y%m%d_%H%M%S).log"
echo "Создаю backup: $BACKUP_NAME"
cp "$LOG_FILE" "$BACKUP_DIR/$BACKUP_NAME"
# Очищаем текущий лог
> "$LOG_FILE"
echo "Лог-файл очищен"
# Удаляем старые бэкапы (старше 30 дней)
find "$BACKUP_DIR" -name "*.log" -mtime +30 -delete
echo "Удалены backup-файлы старше 30 дней"
else
echo "Размер лог-файла в норме: ${FILE_SIZE_MB}MB"
fi
else
echo "Лог-файл не найден: $LOG_FILE"
fi
5. Проверка паролей на истечение
bash
#!/bin/bash
# check_password_expiry.sh - проверка истечения паролей
USERNAME="$1"
if [ -z "$USERNAME" ]; then
echo "Использование: $0 <username>"
echo "Или проверка всех пользователей: $0 --all"
exit 1
fi
if [ "$USERNAME" = "--all" ]; then
# Проверяем всех пользователей с оболочкой
echo "Проверяю всех пользователей..."
for USER in $(getent passwd | grep -v "/nologin\|/false" | cut -d: -f1); do
echo -n "$USER: "
chage -l "$USER" 2>/dev/null | grep "Password expires" | cut -d: -f2
done
else
# Проверяем конкретного пользователя
if id "$USERNAME" &>/dev/null; then
echo "=== Информация о пароле для $USERNAME ==="
chage -l "$USERNAME"
# Проверяем, истек ли пароль
EXPIRY_DATE=$(chage -l "$USERNAME" | grep "Password expires" | cut -d: -f2)
if [ "$EXPIRY_DATE" = " never" ] || [ "$EXPIRY_DATE" = "never" ]; then
echo "✅ Пароль не истекает"
else
echo "⚠️ Пароль истекает: $EXPIRY_DATE"
fi
else
echo "Пользователь $USERNAME не найден"
fi
fi
6. Простой мониторинг процессов
bash
#!/bin/bash
# process_watch.sh - мониторинг потребления ресурсов процессами
echo "=== ТОП-10 ПРОЦЕССОВ ПО ПОТРЕБЛЕНИЮ CPU ==="
ps aux --sort=-%cpu | head -11
echo -e "\n=== ТОП-10 ПРОЦЕССОВ ПО ПОТРЕБЛЕНИЮ ПАМЯТИ ==="
ps aux --sort=-%mem | head -11
echo -e "\n=== ПРОВЕРКА КРИТИЧЕСКИХ СЛУЖБ ==="
SERVICES=("sshd" "crond" "syslog" "network")
for SERVICE in "${SERVICES[@]}"; do
if systemctl is-active "$SERVICE" &>/dev/null; then
echo "✅ $SERVICE: запущен"
else
echo "❌ $SERVICE: НЕ ЗАПУЩЕН!"
fi
done
# Проверяем зомби-процессы
ZOMBIES=$(ps aux | grep 'Z' | grep -v grep | wc -l)
if [ "$ZOMBIES" -gt 0 ]; then
echo -e "\n⚠️ Найдено зомби-процессов: $ZOMBIES"
ps aux | grep 'Z' | grep -v grep
fi
7. Автоматическое создание пользователя
bash
#!/bin/bash
# create_user.sh - безопасное создание пользователя
if [ "$EUID" -ne 0 ]; then
echo "Этот скрипт нужно запускать с правами root"
exit 1
fi
read -p "Введите имя пользователя: " USERNAME
# Проверяем, существует ли пользователь
if id "$USERNAME" &>/dev/null; then
echo "Ошибка: пользователь $USERNAME уже существует!"
exit 1
fi
# Проверяем корректность имени пользователя
if ! [[ "$USERNAME" =~ ^[a-z][-a-z0-9_]*$ ]]; then
echo "Ошибка: имя пользователя должно начинаться с буквы и содержать только строчные буквы, цифры, дефисы и подчеркивания"
exit 1
fi
# Запрашиваем дополнительные данные
read -p "Введите полное имя пользователя: " FULL_NAME
read -p "Добавить пользователя в группу wheel (администраторы)? (y/N): " ADD_TO_WHEEL
read -s -p "Введите пароль для пользователя: " PASSWORD
echo
# Создаем пользователя
echo "Создаю пользователя $USERNAME..."
useradd -c "$FULL_NAME" -m -s /bin/bash "$USERNAME"
if [ $? -eq 0 ]; then
echo "Устанавливаю пароль..."
echo "$USERNAME:$PASSWORD" | chpasswd
# Принуждаем сменить пароль при первом входе
chage -d 0 "$USERNAME"
# Добавляем в группу администраторов если нужно
if [ "$ADD_TO_WHEEL" = "y" ] || [ "$ADD_TO_WHEEL" = "Y" ]; then
usermod -aG wheel "$USERNAME"
echo "Пользователь добавлен в группу wheel"
fi
echo "✅ Пользователь $USERNAME успешно создан!"
echo "Пароль нужно будет сменить при первом входе"
else
echo "❌ Ошибка при создании пользователя"
exit 1
fi
8. Проверка сетевых соединений
bash
#!/bin/bash
# network_check.sh - базовая проверка сети
echo "=== ПРОВЕРКА СЕТИ ==="
# 1. Проверка сетевых интерфейсов
echo -e "\n1. СЕТЕВЫЕ ИНТЕРФЕЙСЫ:"
ip addr show | grep -E "(inet|state)" | grep -v "127.0.0.1"
# 2. Проверка маршрутов
echo -e "\n2. ТАБЛИЦА МАРШРУТИЗАЦИИ:"
ip route show | head -10
# 3. Проверка DNS
echo -e "\n3. ПРОВЕРКА DNS:"
if grep -q "nameserver" /etc/resolv.conf; then
echo "DNS серверы настроены:"
grep "nameserver" /etc/resolv.conf
else
echo "⚠️ DNS серверы не настроены!"
fi
# 4. Проверка доступности интернета
echo -e "\n4. ПРОВЕРКА ДОСТУПНОСТИ ИНТЕРНЕТА:"
if ping -c 2 8.8.8.8 &>/dev/null; then
echo "✅ Интернет доступен (ping 8.8.8.8)"
else
echo "❌ Нет доступа к интернету"
fi
# 5. Проверка открытых портов
echo -e "\n5. ОТКРЫТЫЕ ПОРТЫ (топ-10):"
ss -tuln | head -12
# 6. Проверка установленных соединений
echo -e "\n6. АКТИВНЫЕ СОЕДИНЕНИЯ:"
ESTABLISHED=$(ss -tun state established | wc -l)
echo "Установленных соединений: $((ESTABLISHED - 1))"
Практические задачи для начинающего администратора
Задача 1: Мониторинг использования домашних директорий
Напишите скрипт, который:
- Проверяет размер домашних директорий всех пользователей
- Если размер превышает квоту (например, 1GB), отправляет предупреждение
- Выводит отчет в формате:
Пользователь | Размер | Лимит | Статус
bash
#!/bin/bash
# Решение задачи 1
QUOTA_LIMIT_GB=1
REPORT_FILE="/tmp/home_dir_report.txt"
echo "Отчет проверки домашних директорий" > "$REPORT_FILE"
echo "Генерируется: $(date)" >> "$REPORT_FILE"
echo "======================================" >> "$REPORT_FILE"
echo "Пользователь | Размер(GB) | Статус" >> "$REPORT_FILE"
# Получаем список пользователей с домашними директориями
for USER_HOME in /home/*; do
if [ -d "$USER_HOME" ]; then
USERNAME=$(basename "$USER_HOME")
SIZE_KB=$(du -sk "$USER_HOME" 2>/dev/null | cut -f1)
SIZE_GB=$(echo "scale=2; $SIZE_KB / 1024 / 1024" | bc)
# Сравниваем с квотой
if (( $(echo "$SIZE_GB > $QUOTA_LIMIT_GB" | bc -l) )); then
STATUS="ПРЕВЫШЕН ЛИМИТ"
else
STATUS="OK"
fi
echo "$USERNAME | ${SIZE_GB}GB | $STATUS" >> "$REPORT_FILE"
fi
done
cat "$REPORT_FILE"
Задача 2: Резервное копирование конфигурационных файлов
Создайте скрипт, который:
- Копирует важные конфиги (
/etc/passwd,/etc/group,/etc/sudoers,/etc/ssh/sshd_config) - Сохраняет их в архив с датой
- Хранит только последние 7 бэкапов
bash
#!/bin/bash
# Решение задачи 2
BACKUP_DIR="/backup/configs"
CONFIG_FILES=(
"/etc/passwd"
"/etc/group"
"/etc/shadow"
"/etc/gshadow"
"/etc/sudoers"
"/etc/ssh/sshd_config"
"/etc/hosts"
"/etc/resolv.conf"
)
mkdir -p "$BACKUP_DIR"
# Создаем backup
BACKUP_NAME="system_configs_$(date +%Y%m%d_%H%M%S).tar.gz"
tar -czf "$BACKUP_DIR/$BACKUP_NAME" "${CONFIG_FILES[@]}" 2>/dev/null
if [ $? -eq 0 ]; then
echo "✅ Backup создан: $BACKUP_NAME"
# Удаляем старые бэкапы (оставляем 7 последних)
cd "$BACKUP_DIR" || exit
ls -t *.tar.gz 2>/dev/null | tail -n +8 | xargs -r rm -f
echo "Удалены старые backup-файлы"
else
echo "❌ Ошибка при создании backup"
fi
Задача 3: Проверка целостности системных файлов
Напишите скрипт, который проверяет:
- Неизменность критичных бинарных файлов (
/bin/ls,/bin/bash,/usr/bin/sudo) - Сравнивает хэши с эталонными значениями
- Сообщает о любых изменениях
bash
#!/bin/bash
# Решение задачи 3
CHECKSUM_FILE="/root/system_checksums.md5"
CRITICAL_FILES=(
"/bin/ls"
"/bin/bash"
"/usr/bin/sudo"
"/usr/bin/passwd"
"/usr/bin/chmod"
)
# Если файл с checksum'ами не существует, создаем его
if [ ! -f "$CHECKSUM_FILE" ]; then
echo "Создаю эталонные checksum'ы..."
for FILE in "${CRITICAL_FILES[@]}"; do
if [ -f "$FILE" ]; then
md5sum "$FILE" >> "$CHECKSUM_FILE"
fi
done
echo "Эталонные checksum'ы сохранены в $CHECKSUM_FILE"
exit 0
fi
# Проверяем текущие checksum'ы
echo "Проверяю целостность системных файлов..."
CHANGED_FILES=0
for FILE in "${CRITICAL_FILES[@]}"; do
if [ -f "$FILE" ]; then
CURRENT_SUM=$(md5sum "$FILE" | cut -d' ' -f1)
EXPECTED_SUM=$(grep "$FILE" "$CHECKSUM_FILE" | cut -d' ' -f1)
if [ "$CURRENT_SUM" = "$EXPECTED_SUM" ]; then
echo "✅ $(basename "$FILE"): OK"
else
echo "❌ $(basename "$FILE"): ИЗМЕНЕН!"
CHANGED_FILES=$((CHANGED_FILES + 1))
fi
else
echo "⚠️ $FILE: файл не найден"
fi
done
if [ "$CHANGED_FILES" -gt 0 ]; then
echo "🚨 ВНИМАНИЕ! Изменено файлов: $CHANGED_FILES"
else
echo "✅ Все файлы соответствуют эталонным checksum'ам"
fi
Задача 4: Автоматическое обновление системы
Создайте «безопасный» скрипт обновления, который:
- Делает backup важных данных перед обновлением
- Проверяет свободное место на диске
- Обновляет систему только если есть обновления безопасности
- После обновления проверяет, что все службы запущены
bash
#!/bin/bash
# Решение задачи 4 (для Debian/Ubuntu)
LOG_FILE="/var/log/auto_update.log"
MIN_FREE_SPACE_GB=5
echo "$(date) - Начало процедуры обновления" >> "$LOG_FILE"
# 1. Проверка свободного места
FREE_SPACE=$(df -BG / | awk 'NR==2 {print $4}' | sed 's/G//')
if [ "$FREE_SPACE" -lt "$MIN_FREE_SPACE_GB" ]; then
echo "$(date) - ОШИБКА: Мало свободного места ($FREE_SPACE GB)" >> "$LOG_FILE"
echo "Требуется минимум $MIN_FREE_SPACE_GB GB"
exit 1
fi
# 2. Backup списка установленных пакетов
echo "$(date) - Создаю backup списка пакетов..." >> "$LOG_FILE"
dpkg --get-selections > /root/package-list.backup
# 3. Обновление информации о пакетах
echo "$(date) - Обновляю информацию о пакетах..." >> "$LOG_FILE"
apt-get update >> "$LOG_FILE" 2>&1
# 4. Проверка обновлений безопасности
SECURITY_UPDATES=$(apt list --upgradable 2>/dev/null | grep -i security | wc -l)
if [ "$SECURITY_UPDATES" -eq 0 ]; then
echo "$(date) - Обновлений безопасности не найдено" >> "$LOG_FILE"
echo "Обновлений безопасности не найдено"
exit 0
fi
echo "$(date) - Найдено обновлений безопасности: $SECURITY_UPDATES" >> "$LOG_FILE"
# 5. Установка обновлений безопасности
echo "$(date) - Устанавливаю обновления безопасности..." >> "$LOG_FILE"
apt-get upgrade --only-upgrade -y >> "$LOG_FILE" 2>&1
if [ $? -eq 0 ]; then
echo "$(date) - Обновления установлены успешно" >> "$LOG_FILE"
# 6. Проверка критических служб
echo "$(date) - Проверяю критические службы..." >> "$LOG_FILE"
for SERVICE in ssh cron networking; do
if systemctl is-active --quiet "$SERVICE"; then
echo "$(date) - $SERVICE: запущен" >> "$LOG_FILE"
else
echo "$(date) - ВНИМАНИЕ: $SERVICE не запущен!" >> "$LOG_FILE"
systemctl start "$SERVICE"
fi
done
echo "$(date) - Процедура обновления завершена" >> "$LOG_FILE"
echo "✅ Обновление завершено успешно"
else
echo "$(date) - ОШИБКА при установке обновлений" >> "$LOG_FILE"
echo "❌ Ошибка при обновлении"
exit 1
fi
Задача 5: Мониторинг неверных попыток входа
Напишите скрипт, который анализирует /var/log/auth.log и:
- Находит IP-адреса с множественными неудачными попытками входа
- Блокирует их через iptables если попыток больше 5
- Отправляет уведомление администратору
bash
#!/bin/bash
# Решение задачи 5
LOG_FILE="/var/log/auth.log"
BLOCK_THRESHOLD=5
BLOCK_LIST="/root/blocked_ips.txt"
# Получаем список IP с неудачными попытками входа за последний час
FAILED_IPS=$(grep "Failed password" "$LOG_FILE" | grep "$(date '+%b %_d %H')" | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr)
echo "=== НЕУДАЧНЫЕ ПОПЫТКИ ВХОДА (последний час) ==="
echo "$FAILED_IPS"
echo "==============================================="
# Блокируем IP с превышением порога
echo "$FAILED_IPS" | while read COUNT IP; do
if [ "$COUNT" -ge "$BLOCK_THRESHOLD" ] && [ -n "$IP" ]; then
# Проверяем, не заблокирован ли уже этот IP
if ! iptables -L INPUT -n | grep -q "$IP"; then
echo "🚨 Блокирую IP $IP ($COUNT неудачных попыток)"
iptables -A INPUT -s "$IP" -j DROP
echo "$(date): $IP ($COUNT попыток)" >> "$BLOCK_LIST"
# Отправляем уведомление
echo "IP $IP заблокирован за $COUNT неудачных попыток входа" | \
mail -s "Блокировка IP на $(hostname)" admin@example.com
fi
fi
done
Полезные однострочники для ежедневного использования
bash
# 1. Найти большие файлы (>100MB) в домашних директориях
find /home -type f -size +100M -exec ls -lh {} \; 2>/dev/null | sort -k5 -hr
# 2. Показать топ-5 пользователей по использованию памяти
ps aux --sort=-%mem | head -6
# 3. Проверить, кто что делает в системе сейчас
w
# 4. Найти файлы измененные за последние 24 часа
find /etc -type f -mtime -1 2>/dev/null
# 5. Проверить свободное место на всех разделах
df -h | grep -v tmpfs
# 6. Посмотреть последние 10 ошибок из системного лога
tail -20 /var/log/syslog | grep -i error
# 7. Проверить, какие порты слушает система
netstat -tulpn | grep LISTEN
# 8. Найти все исполняемые файлы с SUID битом (потенциально опасные)
find / -perm -4000 -type f 2>/dev/null
# 9. Показать историю команд с временными метками
HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S " history
# 10. Проверить загрузку системы за последние 5 минут
uptime
Советы для начинающего администратора:
- Всегда тестируйте скрипты на тестовой машине перед запуском на production
- Добавляйте проверки — что вы root, что файлы существуют, что достаточно места
- Пишите комментарии — через месяц вы забудете, что делает скрипт
- Логируйте действия — пишите в лог-файл что и когда делали
- Не запускайте скрипты из интернета без анализа — всегда смотрите, что они делают
- Используйте
set -eв начале скриптов для остановки при ошибках - Регулярно делайте бэкапы конфигов перед изменениями
Практикуйтесь на виртуальной машине или в Docker-контейнере. Удачи в освоении Linux! 🐧