Цель урока: Провести "генеральную уборку" и "косметический ремонт" нашего скрипта system_audit.sh. Мы не будем добавлять новую информацию, а сосредоточимся на улучшении того, что уже есть. Мы проведем рефакторинг кода, чтобы сделать его еще чище и профессиональнее, добавим цвета для лучшей читаемости отчета и "причешем" форматирование до идеального состояния.

Часть 1: Теория и практика. Рефакторинг и правильная структура

Рефакторинг - это улучшение кода, не меняя его функциональности. Наша цель - сделать скрипт более понятным и легким для будущих изменений.

Шаг 1: Открываем скрипт и реорганизуем его
Откройте ваш скрипт и приведите его к следующей, логически правильной структуре.

nano ~/scripts/system_audit.sh

Правильная структура:

  1. Шебанг и описание.

  2. Определение всех глобальных переменных и констант (разделители, цвета).

  3. Определение всех функций.

  4. Определение главной main функции, которая вызывает все остальные.

  5. Одна-единственная строка в конце, которая запускает main.

Часть 2: Практика. Исправленная версия скрипта с рабочими цветами

Замените все содержимое вашего файла system_audit.sh на этот код. Он исправляет все ошибки предыдущих версий и, что самое главное, использует правильную команду echo -e для гарантированного отображения цветов.

#!/bin/bash

# ==============================================================================
#
#          FILE: system_audit.sh
# 
#         USAGE: ./system_audit.sh
# 
#   DESCRIPTION: Скрипт для проведения базового аудита системы Linux,
#                с цветным и форматированным выводом.
# 
# ==============================================================================

# --- ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ И КОНСТАНТЫ ---
DIVIDER="--------------------------------------------------------------------"

# Цветовые коды
C_RESET='\e[0m'
C_BOLD='\e[1m'
C_YELLOW='\e[33m'
C_BLUE='\e[34m'


# --- ОБЪЯВЛЕНИЕ ФУНКЦИЙ ---

# Функция для вывода красивого заголовка раздела
print_header() {
    # Используем echo -e для корректной интерпретации \e
    echo -e "\n${C_BLUE}${DIVIDER}${C_RESET}"
    echo -e " ${C_BOLD}${C_YELLOW}$1${C_RESET}"
    echo -e "${C_BLUE}${DIVIDER}${C_RESET}"
}

# Функция для сбора общей информации о системе
get_system_info() {
    print_header "1. Общая информация о системе"
    # Для форматированного вывода printf подходит идеально, но без цветов
    printf "%-20s: %s\n" "Имя хоста" "$(hostname)"
    printf "%-20s: %s\n" "Дистрибутив" "$(lsb_release -ds 2>/dev/null || echo 'N/A')"
    printf "%-20s: %s\n" "Версия ядра" "$(uname -r)"
    printf "%-20s: %s\n" "Время работы" "$(uptime -p)"
} 

# Функция для сбора информации о CPU
get_cpu_info() {
    print_header "2. Информация о CPU"
    printf "%-20s: %s\n" "Модель" "$(awk -F: '/model name/ {print $2; exit}' /proc/cpuinfo | sed 's/^[ \t]*//')"
    printf "%-20s: %s\n" "Количество ядер" "$(nproc)"
    printf "%-20s: %s\n" "Текущая загрузка" "$(top -bn1 | grep 'Cpu(s)' | awk '{print $2 + $4}')%"
}

# Функция для сбора информации о RAM
get_memory_info() {
    print_header "3. Информация о RAM"
    # Для вывода таблиц используем echo -e вместе с табуляцией \t
    echo -e "${C_BOLD}                всего\tисп.\tсвоб.\tдоступно${C_RESET}"
    free -h | awk '/^Mem:/{print "Память (RAM):\t" $2 "\t" $3 "\t" $4 "\t" $7}
                    /^Swap:/{print "Swap:\t\t" $2 "\t" $3 "\t" $4}'
}

# Функция для сбора информации о дисках
get_disk_info() {
    print_header "4. Информация о дисковом пространстве"
    echo -e "${C_BOLD}Файловая система\tТип\tРазмер\tИсп.\tДост.\tИсп.%${C_RESET}"
    df -hT | grep -vE 'tmpfs|squashfs' | awk 'NR>1 {print $1 "\t" $2 "\t" $3 "\t" $4 "\t" $5 "\t" $6}'
}

# Функция для сбора информации о сети
get_network_info() {
    print_header "5. Информация о сети"
    printf "%-20s: %s\n" "Имя хоста (FQDN)" "$(hostname -f)"
    
    ip_addresses=$(ip -4 addr | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
    printf "%-20s:\n%s\n" "IP-адреса" "$ip_addresses"

    echo -e "\n${C_BOLD}Открытые порты (TCP/UDP):${C_RESET}"
    ss -tulpn | awk 'NR>1 {print $1, $5, $7}'
}

# --- ОСНОВНОЙ БЛОК (MAIN) ---
main() {
    print_header "ОТЧЕТ О СОСТОЯНИИ СИСТЕМЫ"
    
    get_system_info
    get_cpu_info
    get_memory_info
    get_disk_info
    get_network_info

    echo -e "\n${C_BLUE}${DIVIDER}${C_RESET}"
}

# --- ТОЧКА ВХОДА ---
main

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

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

  2. Сделайте скрипт исполняемым: chmod +x system_audit.sh.

  3. Запустите его: ./system_audit.sh.

Теперь вывод в вашем терминале должен быть цветным и отформатированным, как и ожидалось.

Разбор ключевых улучшений: Что изменилось по сравнению с Уроком 33

Тот код, который мы вставили выше - это "причесанная" версия нашего скрипта. Давайте подробно разберем, какие именно улучшения мы внесли по сравнению с тем, что у нас было в конце предыдущего урока.

  1. Появились глобальные переменные (константы):

    • Что было: Строка с дефисами ("-----") была "зашита" прямо в коде функции print_header.

    • Что стало: Мы вынесли эту строку в переменную DIVIDER в самом верху скрипта.

    • Почему это лучше: Теперь, если мы захотим сделать разделитель длиннее или заменить его на другой символ (например, =), нам нужно будет изменить всего одну строку в начале скрипта, а не искать все вхождения по коду. Это делает код более гибким и легким в поддержке.

  2. Добавлены переменные для цветов:

    • Что было: Весь наш отчет был одноцветным.

    • Что стало: Мы создали целый блок переменных (C_RESETC_BOLDC_YELLOWC_BLUE), которые хранят в себе сложные ANSI-коды для управления цветом в терминале.

    • Почему это лучше: Вместо того чтобы вставлять в код непонятные последовательности вроде \e[33m, мы используем осмысленное имя ${C_YELLOW}. Код становится самодокументируемым и гораздо более читаемым.

  3. Функция print_header была полностью переписана:

    • Что было: Функция использовала printf и не поддерживала цвета.

    • Что стало: Теперь она использует echo -e для гарантированной обработки цветовых кодов. Она принимает текст заголовка ($1) и "оборачивает" его в переменные ${C_BOLD}${C_YELLOW}, а в конце обязательно сбрасывает цвет с помощью ${C_RESET}.

    • Почему это лучше: Эта функция стала нашим универсальным инструментом для создания красивых, цветных заголовков.

  4. Изменен способ вывода таблиц (в get_memory_info и get_disk_info):

    • Что было: Мы использовали сложный printf с выравниванием по колонкам (%-15s %10s...).

    • Что стало: Мы перешли на более простой и надежный способ - вывод полей через символ табуляции (\t) внутри команды echo -e и awk.

    • Почему это лучше: Табуляция автоматически создает ровные столбцы в большинстве терминалов. Код echo -e "...\t...\t..." гораздо проще читать и отлаживать, чем длинную строку формата для printf.

  5. Структура main стала чище:

    • Что было: Главный заголовок печатался прямо в функции main.

    • Что стало: Теперь main использует нашу же функцию print_header для вывода главного заголовка.

    • Почему это лучше: Это делает код более консистентным (все заголовки создаются одинаково) и еще раз демонстрирует принцип повторного использования кода.

  6. Мелкие улучшения в командах:

    • lsb_release -ds: Мы использовали ключ -ds вместо lsb_release -d | cut .... Это более короткий и элегантный способ получить имя дистрибутива без лишних слов.

    • awk '/model name/ {print $2; exit}': В функции get_cpu_info мы добавили exit в команду awk. Это небольшая оптимизация: как только awk найдет первую строку с model name, он напечатает ее и сразу завершит работу, не читая остаток файла /proc/cpuinfo.

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

На следующем, 35-м уроке, мы завершим наш проект. Мы добавим в скрипт обработку ошибок и научимся принимать параметры командной строки, чтобы сделать наш инструмент еще более гибким и надежным.

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

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

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

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

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