
Цель урока: Завершить работу над нашим скриптом system_audit.sh, добавив в него три важнейших элемента профессиональных утилит: надежную проверку всех зависимостей, гибкую обработку параметров командной строки и улучшенную справку для пользователя. Это превратит наш скрипт в законченный, надежный и удобный инструмент.
В предыдущих уроках мы то устанавливали недостающие пакеты, то просто выводили ошибку. Это непоследовательно. Давайте придем к единому, профессиональному подходу: скрипт должен проверить все необходимое для работы, сообщить пользователю обо всех недостающих компонентах и только потом завершиться, если что-то не так.
Открываем наш скриптnano ~/scripts/system_audit.sh
Замените всё содержимое вашего файла system_audit.sh на этот код:
#!/bin/bash
# ==============================================================================
#
# FILE: system_audit.sh
#
# USAGE: ./system_audit.sh [--disk | --network | --help]
#
# DESCRIPTION: Скрипт для проведения базового аудита системы Linux,
# с цветным и форматированным выводом.
#
# ==============================================================================
# --- ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ И КОНСТАНТЫ ---
DIVIDER="--------------------------------------------------------------------"
C_RESET='\e[0m'
C_BOLD='\e[1m'
C_RED='\e[31m'
C_YELLOW='\e[33m'
C_BLUE='\e[34m'
# --- ОБЪЯВЛЕНИЕ ФУНКЦИЙ ---
# Функция для вывода красивого заголовка раздела
print_header() {
echo -e "\n${C_BLUE}${DIVIDER}${C_RESET}"
echo -e " ${C_BOLD}${C_YELLOW}$1${C_RESET}"
echo -e "${C_BLUE}${DIVIDER}${C_RESET}"
}
# Функция для вывода справки по использованию скрипта
usage() {
echo "ИСПОЛЬЗОВАНИЕ: $0 [ПАРАМЕТР]"
echo "Создает отчет о состоянии системы."
echo
echo -e "${C_BOLD}Параметры:${C_RESET}"
echo -e " ${C_BOLD}--disk${C_RESET} Показать только информацию о дисковом пространстве."
echo -e " ${C_BOLD}--network${C_RESET} Показать только информацию о сети."
echo -e " ${C_BOLD}--help${C_RESET} Показать эту справку."
echo
echo -e "${C_BOLD}Примеры:${C_RESET}"
echo " $0 --disk"
echo " $0"
}
# Функция для проверки наличия необходимых утилит
check_dependencies() {
local dependencies=("lsb_release" "ss" "nproc" "uptime" "hostname" "uname" "ip" "free" "df" "top" "awk" "grep" "cut" "sed")
local missing_deps=()
for cmd in "${dependencies[@]}"; do
if ! command -v "$cmd" &> /dev/null; then
missing_deps+=("$cmd")
fi
done
if [ ${#missing_deps[@]} -ne 0 ]; then
echo -e "${C_BOLD}${C_RED}Ошибка: Для работы скрипта не найдены следующие команды:${C_RESET}"
for dep in "${missing_deps[@]}"; do
echo -e "${C_RED}- $dep${C_RESET}"
done
echo "Пожалуйста, установите недостающие пакеты и попробуйте снова."
exit 1
fi
}
# ... (все ваши функции get_... остаются без изменений) ...
get_system_info() {
print_header "1. Общая информация о системе"
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)"
}
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" "Текущая загрузка" "$(LC_ALL=C top -bn1 | grep 'Cpu(s)' | awk '{print $2 + $4}')%"
}
get_memory_info() {
print_header "3. Информация о RAM"
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() {
# В первую очередь, проверяем зависимости
check_dependencies
# Обработка параметров командной строки
if [ "$1" ]; then
case "$1" in
--disk)
get_disk_info
;;
--network)
get_network_info
;;
--help)
usage
;;
*)
echo -e "${C_BOLD}${C_RED}Ошибка: Неизвестный параметр '$1'${C_RESET}"
echo "Попробуйте '$0 --help' для справки."
exit 1
;;
esac
else
# Если аргументов нет, выводим полный отчет
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}"
fi
}
# --- ТОЧКА ВХОДА ---
main "$@"
Сохраните и запустите скрипт.
Разбор изменений: Что и почему мы поменяли
Вот детальное объяснение того, что нового появилось в этом коде по сравнению с вашей версией из Урока 34.
-
Добавлена функция usage()
-
Что это: Это новая функция, которая просто печатает справку по использованию скрипта.
-
Где она: В блоке ОБЪЯВЛЕНИЕ ФУНКЦИЙ.
-
Зачем: Любой профессиональный инструмент должен уметь объяснять, как им пользоваться. Это делает скрипт удобным. Мы добавили в нее цвета и примеры для наглядности.
-
-
Добавлена функция check_dependencies()
-
Что это: Это новая функция, которая проверяет наличие всех команд, необходимых для работы скрипта.
-
Где она: В блоке ОБЪЯВЛЕНИЕ ФУНКЦИЙ.
-
Зачем: Это делает наш скрипт надежным. Вместо того чтобы "упасть" с непонятной ошибкой в середине работы, он сразу проверяет все "инструменты" и, если чего-то не хватает, вежливо сообщает об этом пользователю и завершает работу.
-
-
Полностью переписана функция main()
-
Что было: Ваша функция main просто вызывала все get_... функции по порядку.
-
Что стало: Теперь main стала гораздо "умнее".
-
Первым делом она вызывает check_dependencies().
-
Затем она проверяет, был ли скрипту передан параметр (if [ "$1" ]).
-
Если параметр был, запускается конструкция case, которая решает, какую одну функцию (get_disk_info, get_network_info или usage) нужно выполнить.
-
Если параметров не было, выполняется блок else, который, как и раньше, выводит полный отчет.
-
-
Зачем: Это делает наш скрипт гибким. Теперь мы можем не только смотреть полный отчет, но и запрашивать только интересующую нас часть информации.
-
-
Улучшена надежность get_cpu_info()
-
Что было: top -bn1 | grep 'Cpu(s)'...
-
Что стало: LC_ALL=C top -bn1 | grep 'Cpu(s)'...
-
Зачем: LC_ALL=C гарантирует, что вывод top будет на английском языке, независимо от настроек сервера. Это предотвращает ситуацию, когда на русскоязычном сервере grep не найдет строку Cpu(s), потому что она будет называться ЦП(ы).
-
-
Изменена точка входа:
-
Что было: main
-
Что стало: main "$@"
-
Зачем: "$@" - это специальная переменная, которая передает все аргументы, с которыми был запущен скрипт, внутрь функции main. Это необходимо, чтобы наша функция могла получить доступ к $1 (первому аргументу) и проанализировать его.
-
Часть 4: Финальное тестирование
Протестируйте все новые функции:
# Полный отчет
./system_audit.sh
# Только диски
./system_audit.sh --disk
# Справка
./system_audit.sh --help
# Ошибка
./system_audit.sh --blabla
Заключение и итоги блока
Сегодня мы добавили финальные штрихи, которые превратили наш скрипт в настоящую консольную утилиту. Ваш скрипт system_audit.sh - это теперь не просто программа, а надежный, гибкий и удобный инструмент.
На следующем, 36-м уроке, мы начинаем следующий интересный и практический блок: "Сеть, безопасность и веб-сервисы". Мы перейдем от анализа системы к ее построению и настройке. И начнем мы с углубленной диагностики сети с помощью таких инструментов, как ss, netstat и dig.
Перейти к просмотру - УРОК №36.
Промо-код: PROMO15 - скидка 15%!
Введите при оформлении первого заказа на сайте: Hosting-VDS.com

