展示Linux系統(tǒng)信息

展示系統(tǒng)信息

#!/bin/bash

# 系統(tǒng)信息查看腳本 (函數(shù)式版本)
# 適用平臺: Linux / macOS (部分命令需根據(jù)系統(tǒng)調整)

# 顏色定義 (可選,使輸出更美觀)
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}"
}

# 獲取操作系統(tǒng)類型
get_os() {
    echo "$(uname -s)"
}

# 1. 操作系統(tǒng)信息
show_os_info() {
    print_title "操作系統(tǒng)"
    OS=$(get_os)
    echo "系統(tǒng)內(nèi)核: $OS"
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        echo "發(fā)行版: $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 "內(nèi)核版本: $(uname -r)"
    echo "系統(tǒng)架構: $(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 "物理核心數(shù): $(nproc --all)"
    elif [ "$OS" = "Darwin" ]; then
        sysctl -n machdep.cpu.brand_string
        echo "總核心數(shù): $(sysctl -n hw.ncpu)"
    fi
}

# 5. 內(nèi)存使用情況
show_memory_info() {
    print_title "內(nèi)存使用"
    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 "總物理內(nèi)存: $(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. 網(wǎng)絡信息
show_network_info() {
    print_title "網(wǎng)絡信息"
    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}        系統(tǒng)信息報告${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        只顯示操作系統(tǒng)信息"
    echo "  -h, --host      只顯示主機信息"
    echo "  -u, --uptime    只顯示運行時間"
    echo "  -c, --cpu       只顯示CPU信息"
    echo "  -m, --memory    只顯示內(nèi)存信息"
    echo "  -d, --disk      只顯示磁盤信息"
    echo "  -n, --network   只顯示網(wǎng)絡信息"
    echo "  -l, --login     只顯示登錄用戶"
    echo "  -L, --last      只顯示最近登錄"
    echo "  --help          顯示此幫助信息"
}

# 主函數(shù) - 處理命令行參數(shù)
main() {
    # 如果沒有參數(shù),顯示所有信息
    if [ $# -eq 0 ]; then
        show_all_info
        return
    fi
    
    # 解析命令行參數(shù)
    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
}

# 調用主函數(shù),傳遞所有命令行參數(shù)
main "$@"

第二個版本

#!/bin/bash

# 系統(tǒng)信息查看腳本 (函數(shù)式版本)
# 適用平臺: 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. 操作系統(tǒng)信息
show_os_info() {
    print_title "操作系統(tǒng)"
    print_kv "內(nèi)核類型" "$OS"
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        print_kv "發(fā)行版" "$NAME ${VERSION:-}"
    elif command -v sw_vers &>/dev/null; then
        print_kv "macOS 版本" "$(sw_vers -productVersion) ($(sw_vers -buildVersion))"
    fi
    print_kv "內(nèi)核版本" "$(uname -r)"
}

# 2. 主機信息
show_host_info() {
    print_title "主機信息"
    print_kv "主機名" "$(hostname)"
    print_kv "系統(tǒng)架構" "$(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 "物理核心數(shù)" "$(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數(shù)" "$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 "物理核心數(shù)" "$(sysctl -n hw.physicalcpu 2>/dev/null)"
        print_kv "邏輯核心數(shù)" "$(sysctl -n hw.logicalcpu 2>/dev/null)"
    fi
}

# 5. 內(nèi)存使用情況
show_memory_info() {
    print_title "內(nèi)存使用"
    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", "物理內(nèi)存:", $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 "總物理內(nèi)存" "$(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. 網(wǎng)絡信息
show_network_info() {
    print_title "網(wǎng)絡信息"
    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
    # 默認網(wǎng)關
    if [ "$OS" = "Linux" ]; then
        local gw
        gw=$(ip route 2>/dev/null | awk '/^default/ {print $3; exit}')
        [ -n "$gw" ] && print_kv "默認網(wǎng)關" "$gw"
    elif [ "$OS" = "Darwin" ]; then
        local gw
        gw=$(route -n get default 2>/dev/null | awk '/gateway/ {print $2}')
        [ -n "$gw" ] && print_kv "默認網(wǎng)關" "$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}          系統(tǒng)信息報告${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        只顯示操作系統(tǒng)信息"
    echo "  -H, --host      只顯示主機信息"
    echo "  -u, --uptime    只顯示運行時間"
    echo "  -c, --cpu       只顯示CPU信息"
    echo "  -m, --memory    只顯示內(nèi)存信息"
    echo "  -d, --disk      只顯示磁盤信息"
    echo "  -n, --network   只顯示網(wǎng)絡信息"
    echo "  -l, --login     只顯示登錄用戶"
    echo "  -L, --last      只顯示最近登錄"
    echo "  -h, --help      顯示此幫助信息"
}

# 主函數(shù)
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 "$@"
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容