
Цель урока: Провести "генеральную уборку" и "косметический ремонт" нашего скрипта system_audit.sh. Мы не будем добавлять новую информацию, а сосредоточимся на улучшении того, что уже есть. Мы проведем рефакторинг кода, чтобы сделать его еще чище и профессиональнее, добавим цвета для лучшей читаемости отчета и "причешем" форматирование до идеального состояния.
Часть 1: Теория и практика. Рефакторинг и правильная структура
Рефакторинг - это улучшение кода, не меняя его функциональности. Наша цель - сделать скрипт более понятным и легким для будущих изменений.
Шаг 1: Открываем скрипт и реорганизуем его
Откройте ваш скрипт и приведите его к следующей, логически правильной структуре.
nano ~/scripts/system_audit.sh
Правильная структура:
-
Шебанг и описание.
-
Определение всех глобальных переменных и констант (разделители, цвета).
-
Определение всех функций.
-
Определение главной main функции, которая вызывает все остальные.
-
Одна-единственная строка в конце, которая запускает 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: Сохранение, права и запуск
-
В nano сохраните файл (Ctrl+O, Enter) и выйдите (Ctrl+X).
-
Сделайте скрипт исполняемым:
chmod +x system_audit.sh. -
Запустите его:
./system_audit.sh.
Теперь вывод в вашем терминале должен быть цветным и отформатированным, как и ожидалось.
Разбор ключевых улучшений: Что изменилось по сравнению с Уроком 33
Тот код, который мы вставили выше - это "причесанная" версия нашего скрипта. Давайте подробно разберем, какие именно улучшения мы внесли по сравнению с тем, что у нас было в конце предыдущего урока.
-
Появились глобальные переменные (константы):
-
Что было: Строка с дефисами ("-----") была "зашита" прямо в коде функции print_header.
-
Что стало: Мы вынесли эту строку в переменную DIVIDER в самом верху скрипта.
-
Почему это лучше: Теперь, если мы захотим сделать разделитель длиннее или заменить его на другой символ (например, =), нам нужно будет изменить всего одну строку в начале скрипта, а не искать все вхождения по коду. Это делает код более гибким и легким в поддержке.
-
-
Добавлены переменные для цветов:
-
Что было: Весь наш отчет был одноцветным.
-
Что стало: Мы создали целый блок переменных (C_RESET, C_BOLD, C_YELLOW, C_BLUE), которые хранят в себе сложные ANSI-коды для управления цветом в терминале.
-
Почему это лучше: Вместо того чтобы вставлять в код непонятные последовательности вроде \e[33m, мы используем осмысленное имя ${C_YELLOW}. Код становится самодокументируемым и гораздо более читаемым.
-
-
Функция print_header была полностью переписана:
-
Что было: Функция использовала printf и не поддерживала цвета.
-
Что стало: Теперь она использует echo -e для гарантированной обработки цветовых кодов. Она принимает текст заголовка ($1) и "оборачивает" его в переменные ${C_BOLD}${C_YELLOW}, а в конце обязательно сбрасывает цвет с помощью ${C_RESET}.
-
Почему это лучше: Эта функция стала нашим универсальным инструментом для создания красивых, цветных заголовков.
-
-
Изменен способ вывода таблиц (в get_memory_info и get_disk_info):
-
Что было: Мы использовали сложный printf с выравниванием по колонкам (%-15s %10s...).
-
Что стало: Мы перешли на более простой и надежный способ - вывод полей через символ табуляции (\t) внутри команды echo -e и awk.
-
Почему это лучше: Табуляция автоматически создает ровные столбцы в большинстве терминалов. Код echo -e "...\t...\t..." гораздо проще читать и отлаживать, чем длинную строку формата для printf.
-
-
Структура main стала чище:
-
Что было: Главный заголовок печатался прямо в функции main.
-
Что стало: Теперь main использует нашу же функцию print_header для вывода главного заголовка.
-
Почему это лучше: Это делает код более консистентным (все заголовки создаются одинаково) и еще раз демонстрирует принцип повторного использования кода.
-
-
Мелкие улучшения в командах:
-
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

