分享一个Shell脚本,用于一键生成服务器硬件信息报告,包括CPU、内存、磁盘、网卡和GPU等硬件信息

#!/bin/bash
# 定义颜色变量
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color
# 获取当前日期和时间
current_date=$(date "+%Y年%m月%d日 %A %H:%M:%S")
# 获取主机名
hostname=$(hostname)
# 获取操作系统及版本信息
get_os_info() {
    echo -e "${YELLOW}操作系统及版本信息:${NC}"
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        echo -e "${GREEN}操作系统: $NAME${NC}"
        echo -e "${GREEN}版本: $PRETTY_NAME${NC}"
    else
        echo -e "${RED}无法获取操作系统及版本信息${NC}"
    fi
}
# 获取主板信息
get_pm_info() {
    echo -e "${YELLOW}主板信息:${NC}"
    dmidecode -t 1 | grep -E "Manufacturer|Product Name|Serial Number"
}
# 获取CPU信息
get_cpu() {
    echo -e "${YELLOW}CPU信息:${NC}"
    dmidecode -t processor | grep -E 'Socket|Core Count|Version|Thread Count|Current Speed|Max Speed'
}
# 获取内存信息
get_mem() {
    echo -e "${YELLOW}内存信息:${NC}"
    dmidecode_output=$(dmidecode -t memory)

    # 计算总内存,正确处理MB和GB单位
    total_memory=$(echo "$dmidecode_output" | grep -A 10 "Memory Device" | grep "Size:" | grep -v "No Module Installed" | awk '{
        if ($3 == "MB") total += $2 / 1024
        else if ($3 == "GB") total += $2
        } END {printf "%.2f GiB", total}')
        echo -e "${GREEN}当前总内存: $total_memory${NC}"

    # 提取内存槽位总数
    total_slots=$(echo "$dmidecode_output" | grep "Number Of Devices" | awk '{print $NF}')
    echo -e "${GREEN}内存槽位总数: $total_slots${NC}"

    # 提取已安装的内存模块数量
    installed_memory=$(echo "$dmidecode_output" | grep -v Volatile | grep -c "Size: [0-9]")
    echo -e "${GREEN}已安装的内存槽位数量: $installed_memory${NC}"

    # 计算未使用的槽位数量
    unused_slots=$((total_slots - installed_memory))
    echo -e "${GREEN}未使用的槽位数量: $unused_slots${NC}"

    # 提取每根内存的详细信息
    echo -e "${GREEN}已安装内存的详细信息:${NC}"
    echo "$dmidecode_output" | grep -A 32 "Memory Device" | head -22 | grep -E -w "Manufacturer|Type:|Size|Speed|Part Number" | sed '/No Module Installed/d'
}
# 获取磁盘信息
get_disk() {
    echo -e "${YELLOW}磁盘信息:${NC}"
    lsblk -d -o NAME,TYPE,SIZE | grep -v loop
}

# 获取物理网卡信息
get_nic_info() {
    echo -e "${YELLOW}物理网卡信息:${NC}"
    # 获取物理网卡信息,过滤掉虚拟网卡(如docker网卡)
    nic_info=$(ip -o link show | awk -F': ' '{print $2}' | grep -E '^(eth|ens|enp)')
    while IFS= read -r line; do
        echo -e "${GREEN}网卡名称: $line${NC}"
        if ip -o link show $line | grep -q "state UP"; then
            echo -e "${GREEN}状态: 已连接${NC}"
        else
            echo -e "${RED}状态: 未连接${NC}"
        fi
    done <<< "$nic_info"
}

# 定义获取显卡信息的函数
get_gpu_info() {
    echo -e "${YELLOW}GPU信息:${NC}"
    if command -v nvidia-smi &> /dev/null; then
        nvidia-smi -L
        # 获取显卡型号
        gpu_model=$(nvidia-smi -L | head -n 1 | grep -oP 'GPU 0: \K.*(?= \()')
        
        # 获取显卡数量
        gpu_count=$(nvidia-smi -L | wc -l)
        
        # 获取显存信息(单位:MB)
        memory_total_mb=$(nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounits | head -n 1)
        
        # 获取默认功率(单位:W)
        power_limit_w=$(nvidia-smi --query-gpu=power.limit --format=csv,noheader,nounits | head -n 1)
        
        # 将显存从 MB 转换为 GB
        memory_total_gb=$(echo "scale=2; $memory_total_mb / 1024" | bc)
        
        # 输出汇总信息
        echo -e "${GREEN}GPU Model: $gpu_model${NC}"
        echo -e "${GREEN}GPU Count: $gpu_count${NC}"
        echo -e "${GREEN}Memory Total (GB): $memory_total_gb${NC}"
        echo -e "${GREEN}Power Limit (W): $power_limit_w${NC}"
    else
        echo -e "${RED}无GPU信息${NC}"
    fi
}
# 主函数
main() {
    echo -e "${YELLOW}==================== 服务器硬件信息报告 ====================${NC}"
    echo -e "${YELLOW}日期: $current_date${NC}"
    echo -e "${YELLOW}主机名: $hostname${NC}"
    echo -e "${YELLOW}============================================================${NC}"
    get_os_info
    get_pm_info
    get_cpu
    get_mem
    get_disk
    get_nic_info
    get_gpu_info
}

# 执行主函数并将输出保存到文件
main | tee /tmp/server-$(date +%F_%H-%M-%S).txt

使用方法:

将上述脚本保存为hardware_info.sh,然后运行以下命令

chmod +x hardware_info.sh
./hardware_info.sh
#ubuntu类
sudo ./hardware_info.sh