Получаем сведения о системе

#!/usr/bin/env bash

# Справка
display_help() {
    echo "Ключи: $0 [--host | --user | --help]"
    echo "--host: Информация о хосте"
    echo "--user: Информация о пользователях"
    echo "--help: Информация о том, какие параметры поддерживает скрипт и что они значат"
}

# Информация о хосте
display_host_info() {
    echo "Информация о хосте:"
    echo "-------------------"
    echo
    echo "Количество ядер CPU: $(nproc)"
    echo "--------------------"
    echo
    echo "Объём ОЗУ в системе / использовано ОЗУ: $(free -h | grep Mem | awk '{print $2 " / " $3}')"
    echo "---------------------------------------"
    echo
    echo "Информация о дисках:"
    echo "--------------------"
    echo
    disks=$(lsblk -o KNAME -n)
    for disk in $disks
    do
        echo "Диск: $disk"

    	size=$(lsblk -b -o SIZE -n -d /dev/$disk)
    	echo "Размер: $((size/1024/1024/1024)) GB"

    	used_percent=$(echo $(lsblk -b -o FSUSE% -n -d /dev/$disk | sed -r 's/[\%]+//g'))
    	echo "Свободно: $((100-used_percent))%"

        errors=$(smartctl -l error /dev/$disk | grep "Error" | wc -l)
        echo "Количество ошибок: $errors"
        echo
    done

    echo "Средняя загрузка системы (load average): $(uptime | awk -F'average:' '{print $2}')"
    echo "----------------------------------------"
    echo
    echo "Текущее время: $(date +"%T")"
    echo "--------------"
    echo
    echo "Время работы системы (Uptime): $(uptime -p)"
    echo "------------------------------"
    echo
    echo "Сетевые интерфейсы:"
    echo "-------------------"
    echo
    interfaces=$(ip link show | awk -F': ' '/^[0-9]+:/{print $2}')
    for interface in $interfaces; do
        echo "Interface: $interface"
        status=$(ip link show "$interface" | grep "state" | awk '{print $9}')
        echo "Status: $status"
        ip_address=$(ip addr show $interface | awk '/inet /{print $2}')
        echo "IP Address: $ip_address"
        # Получаем количество отправленных и полученных пакетов
        tx_packets=$(ip -s link show "$interface" | awk '/TX: bytes/{getline; print $2}')
        rx_packets=$(ip -s link show "$interface" | awk '/RX: bytes/{getline; print $2}')
        tx_errors=$(ip -s link show "$interface" | awk '/TX: bytes/{getline; print $3}')
        rx_errors=$(ip -s link show "$interface" | awk '/RX: bytes/{getline; print $3}')
        echo "Packets Sent: $tx_packets"
        echo "Errors Sent: $tx_errors"
        echo "Packets Received: $rx_packets"
        echo "Errors Received: $rx_errors"
        echo
    done

    echo
    echo "Прослушиваемые порты:"
    echo "---------------------"
    echo
    netstat -tulpan | grep "LISTEN"
    #ss -lntup | grep "LISTEN"
    echo
    echo "----------------------------------------------"
}

# Информация о пользователях
display_user_info() {
    echo "Информация о пользователях:"
    echo "---------------------------"
    echo
    echo "Список пользователей в системе:"
    echo "-------------------------------"
    echo
    cat /etc/passwd | awk -F':' '{print $1}'
    echo
    echo "Список root-пользователей:"
    echo "--------------------------"
    echo
    cat /etc/passwd | awk -F':' '{if ($3 == 0) print $1}'
    echo
    echo "Список залогиненных пользователей:"
    echo "----------------------------------"
    echo
    who | awk '{print $1}'
    echo
    echo "----------------------------------"
}

# Объявление ключей
OPTS=$(getopt -o "h" -l "help,host,user" -- "$@")

# Вывод help если скрипт запущен без параметров
if [[ $# -eq 0 ]]; then
  display_help
  exit 0
fi

eval set -- "$OPTS"

while true; do
    case "$1" in
        --host)
            display_host_info
            shift
            ;;
        --user)
            display_user_info
            shift
            ;;
        --help)
            display_help
            exit 0
            ;;
        --)
            shift
            break
            ;;
        *)
            echo "Неправильный ключ. Используйте --help, --host, --user"
            exit 1
            ;;
    esac
done