Условия if, параметры условия -eq 0, задачи для Начинающих Linux

Базовые примеры для начинающего админа

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: Мониторинг использования домашних директорий

Напишите скрипт, который:

  1. Проверяет размер домашних директорий всех пользователей
  2. Если размер превышает квоту (например, 1GB), отправляет предупреждение
  3. Выводит отчет в формате: Пользователь | Размер | Лимит | Статус

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: Резервное копирование конфигурационных файлов

Создайте скрипт, который:

  1. Копирует важные конфиги (/etc/passwd/etc/group/etc/sudoers/etc/ssh/sshd_config)
  2. Сохраняет их в архив с датой
  3. Хранит только последние 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: Проверка целостности системных файлов

Напишите скрипт, который проверяет:

  1. Неизменность критичных бинарных файлов (/bin/ls/bin/bash/usr/bin/sudo)
  2. Сравнивает хэши с эталонными значениями
  3. Сообщает о любых изменениях

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: Автоматическое обновление системы

Создайте «безопасный» скрипт обновления, который:

  1. Делает backup важных данных перед обновлением
  2. Проверяет свободное место на диске
  3. Обновляет систему только если есть обновления безопасности
  4. После обновления проверяет, что все службы запущены

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 и:

  1. Находит IP-адреса с множественными неудачными попытками входа
  2. Блокирует их через iptables если попыток больше 5
  3. Отправляет уведомление администратору

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

Советы для начинающего администратора:

  1. Всегда тестируйте скрипты на тестовой машине перед запуском на production
  2. Добавляйте проверки — что вы root, что файлы существуют, что достаточно места
  3. Пишите комментарии — через месяц вы забудете, что делает скрипт
  4. Логируйте действия — пишите в лог-файл что и когда делали
  5. Не запускайте скрипты из интернета без анализа — всегда смотрите, что они делают
  6. Используйте set -e в начале скриптов для остановки при ошибках
  7. Регулярно делайте бэкапы конфигов перед изменениями

Практикуйтесь на виртуальной машине или в Docker-контейнере. Удачи в освоении Linux! 🐧

Оставьте комментарий