Цель урока: Завершить фазу сбора данных для нашего скрипта system_audit.sh. Мы напишем код для последней функции, get_network_info, которая будет собирать ключевую сетевую информацию: IP-адреса и список открытых (слушающих) портов. Это позволит нам одним взглядом оценить сетевую конфигурацию сервера и его "поверхность атаки".

Часть 1: Подготовка. Проверяем наличие инструментов

Для профессионального анализа сети мы будем использовать утилиту ss из пакета iproute2. Большинство современных систем поставляются с ним, но на минимальных установках его может не быть. Давайте добавим проверку наличия этого пакета в наш скрипт, чтобы сделать его еще более надежным.

Шаг 1: Добавляем проверку iproute2
Откройте ваш скрипт system_audit.sh в редакторе nano.

nano ~/scripts/system_audit.sh

Найдите наш блок "ПРОВЕРКА И УСТАНОВКА НЕОБХОДИМЫХ ПАКЕТОВ" и добавьте в него проверку для команды ss.

Обновленный блок:

# --- ПРОВЕРКА И УСТАНОВКА НЕОБХОДИМЫХ ПАКЕТОВ ---
# Проверяем, что утилита lsb_release доступна
if ! command -v lsb_release &> /dev/null
then
    echo "Утилита lsb_release не найдена. Устанавливаем пакет lsb-release..."
    apt update > /dev/null && apt install -y lsb-release > /dev/null
fi

# Проверяем, что утилита ss доступна (пакет iproute2)
if ! command -v ss &> /dev/null
then
    echo "Утилита ss не найдена. Устанавливаем пакет iproute2..."
    apt update > /dev/null && apt install -y iproute2 > /dev/null
fi

Теперь наш скрипт перед началом работы убедится, что у него есть все необходимые инструменты.

Часть 2: Практика. Реализация функции get_network_info

Эта функция будет состоять из двух частей: сначала мы выведем общую информацию (IP-адреса), а затем - детальную (открытые порты).

Шаг 1: Вспоминаем, как получить IP-адрес
Мы уже делали это в одном из первых вариантов скрипта. Команда ip a (или ip addr show) выводит всю информацию. Нам нужно отфильтровать ее.

# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 ...
    inet 127.0.0.1/8 scope host lo
    ...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ...
    inet 82.148.28.140/24 brd 82.148.28.255 scope global eth0
    ...

Нам нужна строка, содержащая inet (но не 127.0.0.1), и из нее - второе поле.

Шаг 2: Вспоминаем, как посмотреть слушающие порты
Для этого идеально подходит команда ss, которую мы изучали. Ключи -tulpn - наша стандартная комбинация.

  • -t: TCP порты

  • -u: UDP порты

  • -l: Только слушающие (Listening)

  • -p: Показать процессы, использующие порт

  • -n: Показать числовые значения портов (не http, а 80)

# ss -tulpn
State    Recv-Q   Send-Q     Local Address:Port      Peer Address:Port   Process
LISTEN   0        128              0.0.0.0:22             0.0.0.0:*       users:(("sshd",pid=987,fd=3))
Вывод `ss` имеет удобную табличную структуру, которую мы можем немного "причесать" для нашего отчета.

Шаг 3: Пишем код для функции

Найдите в `nano` функцию `get_network_info` и замените ее код-"заглушку" на следующий:

# Функция для сбора информации о сети
get_network_info() {
    print_header "5. Информация о сети"

    printf "%-20s: %s\n" "Имя хоста" "$(hostname -f)"
    
    # Получаем и выводим все IP-адреса, кроме loopback
    ip_addresses=$(ip -4 addr | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
    printf "%-20s:\n%s\n" "IP-адреса" "$ip_addresses"

    echo
    printf "%s\n" "Открытые порты (TCP/UDP):"
    # Используем ss для получения списка слушающих портов и awk для форматирования
    ss -tulpn | awk 'NR>1 {printf "    %-20s %-20s %-s\n", $5, $1, $7}'
}

Разбор кода - здесь много интересных деталей:

  1. hostname -f: Мы добавили ключ -f (fully qualified), чтобы получить полное доменное имя хоста, если оно задано.

  2. ip_addresses=$(...): Мы "ловим" результат работы сложной команды в переменную ip_addresses.

  3. ip -4 addr: Мы явно просим ip показать только IPv4 адреса.

  4. grep -oP '...': Здесь мы используем продвинутый grep с "жемчужными" (Perl-совместимыми) регулярными выражениями (-P).

    • -o: Показать не всю строку, а только совпавшую часть.

    • '(?<=inet\s)\d+(\.\d+){3}': Это сложное выражение означает: "Найди последовательность цифр с точками (IP-адрес), которой предшествует (?<=) слово inet и пробел". Это профессиональный и надежный способ "выкусить" только IP-адрес из строки.

  5. printf "%-20s:\n%s\n" "IP-адреса" "$ip_addresses": Здесь мы используем \n (перевод строки) прямо в строке формата printf, чтобы вывести IP-адреса на новых строках под заголовком.

  6. ss -tulpn | awk '...': Мы берем вывод ss.

  7. awk 'NR>1 {...}': Как и в прошлом уроке, мы пропускаем первую строку (заголовок от ss).

  8. printf " %-20s %-20s %-s\n", $5, $1, $7: Мы форматируем вывод, печатая:

    • $5: Пятое поле (Local Address:Port).

    • $1: Первое поле (State, обычно LISTEN).

    • $7: Седьмое поле (Process).

    • Мы добавляем 4 пробела в начале " %-20s...", чтобы сделать красивый отступ в отчете.

Часть 4: Финальное тестирование

Шаг 1: Сохранение и запуск

  1. Убедитесь, что вы внесли изменения в функцию.

  2. В nano сохраните файл (Ctrl+OEnter) и выйдите (Ctrl+X).

  3. Запустите наш скрипт в последний раз:

    ./system_audit.sh

Ожидаемый результат:
Вы увидите полный, законченный отчет о состоянии вашего сервера! Все пять разделов теперь заполнены актуальной, полезной и красиво отформатированной информацией. Вы создали полноценный инструмент системного администратора.

Часть 5: Заключение и итоги блока

Поздравляю! Вы успешно завершили данный урок. Ваш скрипт system_audit.sh - это кульминация всех знаний. Вы прошли путь от базовых команд до создания сложного инструмента, который объединяет в себе:

  • Профессиональный скриптинг: Структурирование кода с помощью функций, использование переменных и командной подстановки.

  • Системные утилиты: hostnameunameuptimenprocfreedfipss.

  • Мощную обработку текста: grepcutawk для фильтрации и форматирования вывода.

Этот проект - не просто учебное задание. Это реальный, полезный инструмент, который вы можете использовать в своей повседневной работе.

План "Урок 34-35: Финальная сборка, форматирование, обработка ошибок" - это именно то, чем мы должны сейчас заняться. Это критически важный этап, который превратит наш работающий скрипт в профессиональный и надежный инструмент.

Перейти к просмотру - УРОК №34.

подарок Промо-код: PROMO15 - скидка 15%! огонь

Введите при оформлении первого заказа на сайте: Hosting-VDS.com

авторское право цифровые решения

Помог ли вам данный ответ? 0 Пользователи считают это полезным (0 голосов)