展示Linux系统信息

展示系统信息

#!/bin/bash

# 系统信息查看脚本 (函数式版本)
# 适用平台: Linux / macOS (部分命令需根据系统调整)

# 颜色定义 (可选,使输出更美观)
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 分隔线
print_separator() {
    echo "=============================="
}

# 打印标题
print_title() {
    echo -e "\n${BLUE}[$1]${NC}"
}

# 获取操作系统类型
get_os() {
    echo "$(uname -s)"
}

# 1. 操作系统信息
show_os_info() {
    print_title "操作系统"
    OS=$(get_os)
    echo "系统内核: $OS"
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        echo "发行版: $NAME $VERSION"
    elif command -v sw_vers &>/dev/null; then
        echo "macOS: $(sw_vers -productVersion)"
    fi
}

# 2. 主机信息
show_host_info() {
    print_title "主机信息"
    echo "主机名: $(hostname)"
    echo "内核版本: $(uname -r)"
    echo "系统架构: $(uname -m)"
}

# 3. 运行时间与负载
show_uptime() {
    print_title "运行时间与负载"
    uptime_info=$(uptime)
    echo "$uptime_info"
}

# 4. CPU 信息
show_cpu_info() {
    print_title "CPU 信息"
    OS=$(get_os)
    if [ "$OS" = "Linux" ]; then
        lscpu | grep "Model name" | sed 's/Model name:[[:space:]]*//'
        echo "物理核心数: $(nproc --all)"
    elif [ "$OS" = "Darwin" ]; then
        sysctl -n machdep.cpu.brand_string
        echo "总核心数: $(sysctl -n hw.ncpu)"
    fi
}

# 5. 内存使用情况
show_memory_info() {
    print_title "内存使用"
    OS=$(get_os)
    if [ "$OS" = "Linux" ]; then
        free -h | awk 'NR==1{print $0} NR==2{print $0}'
    elif [ "$OS" = "Darwin" ]; then
        vm_stat | perl -ne '/page size of (\d+)/ and $size=$1; /Pages free:\s+(\d+)/ and printf "Free: %.2f GB\n", $1*$size/1073741824; /Pages active:\s+(\d+)/ and printf "Active: %.2f GB\n", $1*$size/1073741824; /Pages inactive:\s+(\d+)/ and printf "Inactive: %.2f GB\n", $1*$size/1073741824; /Pages speculative:\s+(\d+)/ and printf "Speculative: %.2f GB\n", $1*$size/1073741824; /Pages wired down:\s+(\d+)/ and printf "Wired: %.2f GB\n", $1*$size/1073741824;'
        echo "总物理内存: $(sysctl -n hw.memsize | awk '{printf "%.2f GB\n", $1/1073741824}')"
    fi
}

# 6. 磁盘使用情况
show_disk_info() {
    print_title "磁盘使用 (根目录)"
    df -h / | awk 'NR==1{print $0} NR==2{print $0}'
}

# 7. 网络信息
show_network_info() {
    print_title "网络信息"
    OS=$(get_os)
    if [ "$OS" = "Linux" ]; then
        ip -4 addr show | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | grep -v 127.0.0.1
    elif [ "$OS" = "Darwin" ]; then
        ifconfig | grep "inet " | grep -v 127.0.0.1 | awk '{print $2}'
    fi
}

# 8. 当前登录用户
show_logged_users() {
    print_title "登录用户"
    who | awk '{print $1}' | sort | uniq | paste -s -d ', '
}

# 9. 最近登录历史
show_last_logins() {
    print_title "最近5次登录"
    if command -v last &>/dev/null; then
        last -n 5 | head -n 5
    else
        echo "last 命令不可用"
    fi
}

# 显示所有信息
show_all_info() {
    print_separator
    echo -e "${GREEN}        系统信息报告${NC}"
    print_separator
    
    show_os_info
    show_host_info
    show_uptime
    show_cpu_info
    show_memory_info
    show_disk_info
    show_network_info
    show_logged_users
    show_last_logins
    
    print_separator
}

# 显示帮助信息
show_help() {
    echo "用法: $0 [选项]"
    echo "选项:"
    echo "  -a, --all       显示所有信息 (默认)"
    echo "  -o, --os        只显示操作系统信息"
    echo "  -h, --host      只显示主机信息"
    echo "  -u, --uptime    只显示运行时间"
    echo "  -c, --cpu       只显示CPU信息"
    echo "  -m, --memory    只显示内存信息"
    echo "  -d, --disk      只显示磁盘信息"
    echo "  -n, --network   只显示网络信息"
    echo "  -l, --login     只显示登录用户"
    echo "  -L, --last      只显示最近登录"
    echo "  --help          显示此帮助信息"
}

# 主函数 - 处理命令行参数
main() {
    # 如果没有参数,显示所有信息
    if [ $# -eq 0 ]; then
        show_all_info
        return
    fi
    
    # 解析命令行参数
    case $1 in
        -a|--all)
            show_all_info
            ;;
        -o|--os)
            show_os_info
            ;;
        -h|--host)
            show_host_info
            ;;
        -u|--uptime)
            show_uptime
            ;;
        -c|--cpu)
            show_cpu_info
            ;;
        -m|--memory)
            show_memory_info
            ;;
        -d|--disk)
            show_disk_info
            ;;
        -n|--network)
            show_network_info
            ;;
        -l|--login)
            show_logged_users
            ;;
        -L|--last)
            show_last_logins
            ;;
        --help)
            show_help
            ;;
        *)
            echo "未知选项: $1"
            show_help
            exit 1
            ;;
    esac
}

# 调用主函数,传递所有命令行参数
main "$@"

第二个版本

#!/bin/bash

# 系统信息查看脚本 (函数式版本)
# 适用平台: Linux / macOS

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
BOLD='\033[1m'
NC='\033[0m' # No Color

# 全局缓存 OS 类型,避免重复调用 uname
OS=$(uname -s)

# 分隔线
print_separator() {
    echo "==============================="
}

# 打印标题
print_title() {
    echo -e "\n${BLUE}${BOLD}[$1]${NC}"
}

# 打印键值对
print_kv() {
    echo -e "  ${CYAN}$1:${NC} $2"
}

# 1. 操作系统信息
show_os_info() {
    print_title "操作系统"
    print_kv "内核类型" "$OS"
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        print_kv "发行版" "$NAME ${VERSION:-}"
    elif command -v sw_vers &>/dev/null; then
        print_kv "macOS 版本" "$(sw_vers -productVersion) ($(sw_vers -buildVersion))"
    fi
    print_kv "内核版本" "$(uname -r)"
}

# 2. 主机信息
show_host_info() {
    print_title "主机信息"
    print_kv "主机名" "$(hostname)"
    print_kv "系统架构" "$(uname -m)"
    if [ "$OS" = "Linux" ]; then
        print_kv "虚拟化" "$(systemd-detect-virt 2>/dev/null || echo 'N/A')"
    fi
}

# 3. 运行时间与负载
show_uptime() {
    print_title "运行时间与负载"
    if [ "$OS" = "Linux" ]; then
        local seconds
        seconds=$(awk '{printf "%d", $1}' /proc/uptime 2>/dev/null)
        if [ -n "$seconds" ]; then
            local days=$(( seconds / 86400 ))
            local hours=$(( (seconds % 86400) / 3600 ))
            local mins=$(( (seconds % 3600) / 60 ))
            print_kv "已运行" "${days}天 ${hours}小时 ${mins}分钟"
        fi
    fi
    # 通用:显示原始 uptime 含负载均值
    print_kv "负载均值" "$(uptime | grep -oE 'load average[s]?:.*')"
}

# 4. CPU 信息
show_cpu_info() {
    print_title "CPU 信息"
    if [ "$OS" = "Linux" ]; then
        local model
        model=$(grep -m1 "model name" /proc/cpuinfo 2>/dev/null | sed 's/.*: //')
        print_kv "型号" "${model:-未知}"
        print_kv "物理核心数" "$(grep -c ^processor /proc/cpuinfo 2>/dev/null)"
        local physical
        physical=$(grep "physical id" /proc/cpuinfo 2>/dev/null | sort -u | wc -l)
        [ "$physical" -gt 0 ] && print_kv "物理CPU数" "$physical"
        print_kv "CPU 使用率" "$(top -bn1 2>/dev/null | grep "Cpu(s)" | awk '{printf "%.1f%%", $2+$4}' || echo 'N/A')"
    elif [ "$OS" = "Darwin" ]; then
        print_kv "型号" "$(sysctl -n machdep.cpu.brand_string 2>/dev/null)"
        print_kv "物理核心数" "$(sysctl -n hw.physicalcpu 2>/dev/null)"
        print_kv "逻辑核心数" "$(sysctl -n hw.logicalcpu 2>/dev/null)"
    fi
}

# 5. 内存使用情况
show_memory_info() {
    print_title "内存使用"
    if [ "$OS" = "Linux" ]; then
        free -h | awk '
            NR==1 { printf "  %-12s %8s %8s %8s\n", "", $1, $2, $3 }
            NR==2 { printf "  %-12s %8s %8s %8s\n", "物理内存:", $2, $3, $4 }
            NR==3 { printf "  %-12s %8s %8s %8s\n", "Swap:", $2, $3, $4 }
        '
    elif [ "$OS" = "Darwin" ]; then
        local page_size total_mem free_pages active_pages inactive_pages wired_pages
        page_size=$(sysctl -n hw.pagesize 2>/dev/null || echo 4096)
        total_mem=$(sysctl -n hw.memsize 2>/dev/null)
        eval "$(vm_stat 2>/dev/null | awk -v ps="$page_size" '
            /Pages free/        { free=$3+0 }
            /Pages active/      { active=$3+0 }
            /Pages inactive/    { inactive=$3+0 }
            /Pages wired down/  { wired=$5+0 }
            /Pages speculative/ { spec=$3+0 }
            END {
                used = (active + inactive + wired) * ps
                free_b = (free + spec) * ps
                printf "used_gb=%.2f free_gb=%.2f\n", used/1073741824, free_b/1073741824
            }
        ')"
        print_kv "总物理内存" "$(awk "BEGIN{printf \"%.2f GB\", $total_mem/1073741824}")"
        print_kv "已使用" "${used_gb:-N/A} GB"
        print_kv "空闲(含投机)" "${free_gb:-N/A} GB"
    fi
}

# 6. 磁盘使用情况
show_disk_info() {
    print_title "磁盘使用"
    if [ "$OS" = "Linux" ]; then
        df -hT -x tmpfs -x devtmpfs -x squashfs 2>/dev/null | awk '
            NR==1 { printf "  %s\n", $0 }
            NR>1  { printf "  %s\n", $0 }
        '
    elif [ "$OS" = "Darwin" ]; then
        df -h | grep -E "^/dev/" | awk '{ printf "  %s\n", $0 }'
        # 首行标题
        df -h | awk 'NR==1 { printf "  %s\n", $0 }' | head -1
    fi
}

# 7. 网络信息
show_network_info() {
    print_title "网络信息"
    if [ "$OS" = "Linux" ]; then
        ip -4 addr show 2>/dev/null | awk '
            /^[0-9]+:/ { iface=$2 }
            /inet / && !/127\.0\.0\.1/ {
                gsub("/.*", "", $2)
                printf "  %-12s %s\n", iface, $2
            }
        '
    elif [ "$OS" = "Darwin" ]; then
        ifconfig 2>/dev/null | awk '
            /^[a-z]/ { iface=$1 }
            /inet / && !/127\.0\.0\.1/ {
                printf "  %-12s %s\n", iface, $2
            }
        '
    fi
    # 默认网关
    if [ "$OS" = "Linux" ]; then
        local gw
        gw=$(ip route 2>/dev/null | awk '/^default/ {print $3; exit}')
        [ -n "$gw" ] && print_kv "默认网关" "$gw"
    elif [ "$OS" = "Darwin" ]; then
        local gw
        gw=$(route -n get default 2>/dev/null | awk '/gateway/ {print $2}')
        [ -n "$gw" ] && print_kv "默认网关" "$gw"
    fi
}

# 8. 当前登录用户
show_logged_users() {
    print_title "当前登录用户"
    local users
    users=$(who 2>/dev/null | awk '{print $1}' | sort -u | paste -s -d ', ')
    print_kv "用户" "${users:-(无)}"
}

# 9. 最近登录历史
show_last_logins() {
    print_title "最近5次登录"
    if command -v last &>/dev/null; then
        last -n 5 2>/dev/null | head -n 5
    else
        echo "  last 命令不可用"
    fi
}

# 显示所有信息
show_all_info() {
    print_separator
    echo -e "${GREEN}${BOLD}          系统信息报告${NC}"
    print_separator

    show_os_info
    show_host_info
    show_uptime
    show_cpu_info
    show_memory_info
    show_disk_info
    show_network_info
    show_logged_users
    show_last_logins

    print_separator
}

# 显示帮助信息
show_help() {
    echo -e "用法: ${BOLD}$0${NC} [选项]"
    echo "选项:"
    echo "  -a, --all       显示所有信息 (默认)"
    echo "  -o, --os        只显示操作系统信息"
    echo "  -H, --host      只显示主机信息"
    echo "  -u, --uptime    只显示运行时间"
    echo "  -c, --cpu       只显示CPU信息"
    echo "  -m, --memory    只显示内存信息"
    echo "  -d, --disk      只显示磁盘信息"
    echo "  -n, --network   只显示网络信息"
    echo "  -l, --login     只显示登录用户"
    echo "  -L, --last      只显示最近登录"
    echo "  -h, --help      显示此帮助信息"
}

# 主函数
main() {
    if [ $# -eq 0 ]; then
        show_all_info
        return
    fi

    case $1 in
        -a|--all)     show_all_info ;;
        -o|--os)      show_os_info ;;
        -H|--host)    show_host_info ;;
        -u|--uptime)  show_uptime ;;
        -c|--cpu)     show_cpu_info ;;
        -m|--memory)  show_memory_info ;;
        -d|--disk)    show_disk_info ;;
        -n|--network) show_network_info ;;
        -l|--login)   show_logged_users ;;
        -L|--last)    show_last_logins ;;
        -h|--help)    show_help ;;
        *)
            echo -e "${RED}未知选项: $1${NC}"
            show_help
            exit 1
            ;;
    esac
}

main "$@"
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容