一键查询Linux服务器信息

#!/bin/bash
# 服务器完整信息汇总脚本(无bc依赖版:适配所有Linux系统,最小化安装也能用)
# 执行方式:sudo bash 脚本名.sh

{
clear
echo "===================== 服务器完整信息汇总 ====================="

# 1. 主机名(兜底:获取失败显示"未知主机名")
hostname=$(hostname 2>/dev/null)
hostname=${hostname:-"未知主机名"}
echo "主机名:$hostname"

# 2. 服务器类型(物理机/虚拟机,增加容错)
virt_type=$(systemd-detect-virt 2>/dev/null)
if [ -z "$virt_type" ] || [ "$virt_type" = "none" ]; then
    echo "服务器类型:物理机"
else
    echo "服务器类型:虚拟机($virt_type)"
fi

# 3. CPU信息(修复物理核心统计,适配所有CPU架构)
cpu_model=$(grep -m1 'model name' /proc/cpuinfo 2>/dev/null | awk -F: '{gsub(/^[ \t]/,"",$2); print $2}')
cpu_model=${cpu_model:-"未知CPU型号"}
# 正确统计物理核心:兼容Intel/AMD,支持多physical id(纯awk实现)
physical_cores=$(awk '/physical id/ {pid=$4} /core id/ {core[pid","$4]++} END {print length(core)}' /proc/cpuinfo 2>/dev/null)
physical_cores=${physical_cores:-0}
logical_cores=$(grep -c '^processor' /proc/cpuinfo 2>/dev/null)
logical_cores=${logical_cores:-0}
echo "CPU 型号:$cpu_model"
echo "CPU 物理核心:$physical_cores 核"
echo "CPU 逻辑线程:$logical_cores 线程"

# 4. 物理内存总容量(纯awk实现浮点运算,无bc依赖)
# 方案1:优先从/proc/meminfo读取(最准确)
mem_total_kb=$(grep -E '^MemTotal:' /proc/meminfo 2>/dev/null | awk '{print $2}')
if [ -z "$mem_total_kb" ] || [ "$mem_total_kb" -eq 0 ]; then
    # 方案2:兜底用free命令读取
    mem_total_kb=$(free -k 2>/dev/null | awk '/Mem:/{print $2}')
fi
# 最终兜底:避免空值
mem_total_kb=${mem_total_kb:-0}

# 二进制换算(和FinalShell对齐:1GiB=1024MiB=1024*1024KiB),保留1位小数
mem_gb_bin=$(awk -v kb="$mem_total_kb" 'BEGIN{printf "%.1f", kb/1024/1024}')
# 单位判断(TiB/TB,纯awk实现)
mem_tb_bin=$(awk -v gb="$mem_gb_bin" 'BEGIN{
    if (gb >= 1024) {
        printf "%.1fTB", gb/1024;
    } else {
        printf "%.1fGB", gb;
    }
}')
echo "物理内存总容量:$mem_tb_bin"

# 5. 磁盘空间总容量(纯awk实现,无bc依赖,统一十进制GB/TB)
echo -n "磁盘空间总容量:"
# 优先用df -B1获取字节数(精准)
total_disk_bytes=$(df -B1 --total -x tmpfs -x devtmpfs -x loop 2>/dev/null | awk '/total/{print $2}')
if [ -n "$total_disk_bytes" ] && [ "$total_disk_bytes" -gt 0 ]; then
    # 字节转十进制GB/TB,保留1位小数
    total_disk=$(awk -v bytes="$total_disk_bytes" 'BEGIN{
        gb = bytes / 1000 / 1000 / 1000;
        if (gb >= 1000) {
            printf "%.1fTB", gb/1000;
        } else {
            printf "%.1fGB", gb;
        }
    }')
else
    # 兜底:兼容老系统/无df --total的情况(纯awk解析df -h输出)
    total_disk=$(df -h -x tmpfs -x devtmpfs -x loop 2>/dev/null | awk '
        NR>1 {
            # 提取数值和单位
            val = substr($2, 1, length($2)-1);
            unit = substr($2, length($2));
            # 统一换算为GB
            if (unit == "T") sum += val * 1000;
            else if (unit == "G") sum += val;
            else if (unit == "M") sum += val / 1000;
        }
        END {
            if (sum > 1000) printf "%.1fTB", sum/1000;
            else printf "%.1fGB", sum;
        }
    ')
fi
# 最终兜底
total_disk=${total_disk:-"0.0GB"}
echo "$total_disk"

# 6. 操作系统版本(增加兜底)
if [ -f /etc/os-release ]; then
    os_name=$(. /etc/os-release && echo "$PRETTY_NAME")
else
    os_name=$(lsb_release -d 2>/dev/null | awk -F: '{gsub(/^ /,"",$2); print $2}')
fi
os_name=${os_name:-"未知操作系统"}
echo "操作系统:$os_name"

# 7. 系统安装时间(兼容Ubuntu/CentOS)
install_time=$(ls -lc --time-style=long-iso /etc 2>/dev/null | awk 'NR==2{print $6,$7}')
if [ -z "$install_time" ]; then
    install_time=$(stat -c %y /etc 2>/dev/null | awk '{print $1,$2}' | cut -d '.' -f1)
fi
install_time=${install_time:-"未知安装时间"}
echo "系统安装时间:$install_time"

echo "==============================================================="
}

 

使用方法:

①将以上内容完整复制到命令行中,回车执行

②输出效果展示

图片

 

posted @ 2026-03-26 13:47  HZX↑  阅读(18)  评论(0)    收藏  举报