Цель урока: Завершить работу над нашим скриптом 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.

  1. Добавлена функция usage()

    • Что это: Это новая функция, которая просто печатает справку по использованию скрипта.

    • Где она: В блоке ОБЪЯВЛЕНИЕ ФУНКЦИЙ.

    • Зачем: Любой профессиональный инструмент должен уметь объяснять, как им пользоваться. Это делает скрипт удобным. Мы добавили в нее цвета и примеры для наглядности.

  2. Добавлена функция check_dependencies()

    • Что это: Это новая функция, которая проверяет наличие всех команд, необходимых для работы скрипта.

    • Где она: В блоке ОБЪЯВЛЕНИЕ ФУНКЦИЙ.

    • Зачем: Это делает наш скрипт надежным. Вместо того чтобы "упасть" с непонятной ошибкой в середине работы, он сразу проверяет все "инструменты" и, если чего-то не хватает, вежливо сообщает об этом пользователю и завершает работу.

  3. Полностью переписана функция main()

    • Что было: Ваша функция main просто вызывала все get_... функции по порядку.

    • Что стало: Теперь main стала гораздо "умнее".

      • Первым делом она вызывает check_dependencies().

      • Затем она проверяет, был ли скрипту передан параметр (if [ "$1" ]).

      • Если параметр был, запускается конструкция case, которая решает, какую одну функцию (get_disk_infoget_network_info или usage) нужно выполнить.

      • Если параметров не было, выполняется блок else, который, как и раньше, выводит полный отчет.

    • Зачем: Это делает наш скрипт гибким. Теперь мы можем не только смотреть полный отчет, но и запрашивать только интересующую нас часть информации.

  4. Улучшена надежность get_cpu_info()

    • Что было: top -bn1 | grep 'Cpu(s)'...

    • Что стало: LC_ALL=C top -bn1 | grep 'Cpu(s)'...

    • Зачем: LC_ALL=C гарантирует, что вывод top будет на английском языке, независимо от настроек сервера. Это предотвращает ситуацию, когда на русскоязычном сервере grep не найдет строку Cpu(s), потому что она будет называться ЦП(ы).

  5. Изменена точка входа:

    • Что было: main

    • Что стало: main "$@"

    • Зачем: "$@" - это специальная переменная, которая передает все аргументы, с которыми был запущен скрипт, внутрь функции main. Это необходимо, чтобы наша функция могла получить доступ к $1 (первому аргументу) и проанализировать его.

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

Протестируйте все новые функции:

# Полный отчет
./system_audit.sh

# Только диски
./system_audit.sh --disk

# Справка
./system_audit.sh --help

# Ошибка
./system_audit.sh --blabla

Заключение и итоги блока

Сегодня мы добавили финальные штрихи, которые превратили наш скрипт в настоящую консольную утилиту. Ваш скрипт system_audit.sh - это теперь не просто программа, а надежный, гибкий и удобный инструмент. 

На следующем, 36-м уроке, мы начинаем следующий интересный и практический блок: "Сеть, безопасность и веб-сервисы". Мы перейдем от анализа системы к ее построению и настройке. И начнем мы с углубленной диагностики сети с помощью таких инструментов, как ssnetstat и dig.

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

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

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

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

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