怎么用脚本获取系统版本

wen 实用脚本 3

本文目录导读:

怎么用脚本获取系统版本

  1. 为什么需要脚本获取系统版本?
  2. 跨平台脚本的“黄金法则”:先识别OS再执行分支
  3. Windows系统:PowerShell与CMD的终极对决
  4. Linux/macOS:从uname/etc/os-release的深度解析
  5. 实战案例:一个兼容三端的Python脚本
  6. 常见问答(FAQ)
  7. 安全提示与最佳实践

**
《系统版本探测全攻略:三行脚本搞定跨平台识别(Windows/Linux/macOS)》


目录导读

  1. 为什么需要脚本获取系统版本?
  2. 跨平台脚本的“黄金法则”:先识别OS再执行分支
  3. Windows系统:PowerShell与CMD的终极对决
  4. Linux/macOS:从uname/etc/os-release的深度解析
  5. 实战案例:一个兼容三端的Python脚本
  6. 常见问答(FAQ):脚本获取版本时的坑与解
  7. 安全提示与最佳实践

为什么需要脚本获取系统版本?

在自动化运维、软件部署、日志采集场景中,脚本需要根据不同的操作系统版本加载不同的驱动、依赖库或配置文件,手动点击“设置”查看版本效率极低,且无法批量处理,某企业有200台服务器,若需排查所有CentOS 7.5与Ubuntu 22.04的混合环境,仅靠人工检查至少需要2小时,而脚本可在30秒内输出清晰的清单。

跨平台脚本的“黄金法则”:先识别OS再执行分支

脚本设计的核心逻辑顺序应为:探测平台 → 调用对应命令 → 解析输出 → 返回结构化结果,切忌直接执行ver(Windows命令)或uname -a(Linux命令),否则在异构环境下必报错,建议采用以下伪代码判断:

if [[ "$OSTYPE" == "msys" || "$OSTYPE" == "win32" ]]; then
    # Windows逻辑
elif [[ "$OSTYPE" == "linux-gnu" ]]; then
    # Linux逻辑
elif [[ "$OSTYPE" == "darwin"* ]]; then
    # macOS逻辑
fi

Windows系统:PowerShell与CMD的终极对决

CMD旧法(兼容性优先)
ver 命令仅返回类似“Microsoft Windows [版本 10.0.19045.3324]”的粗粒度信息,无法区分Server版本,若需获取完整版本号,推荐使用:

wmic os get Caption,Version,BuildNumber /format:list

PowerShell新法(信息最全)

Get-ComputerInfo | Select-Object WindowsProductName, WindowsVersion, OsBuildNumber
# 更轻量级写法:
(Get-CimInstance Win32_OperatingSystem).Caption + " Build " + $_.BuildNumber

注意:PowerShell 7+ 中Get-CimInstance已取代旧版Get-WmiObject,前者性能提升40%且支持跨平台运行。

Linux/macOS:从uname/etc/os-release的深度解析

基础命令uname -a
输出内核信息(如Linux VM-4-14-ubuntu 5.4.0-26-generic),但无法直接显示发行版名称(Ubuntu/CentOS/Debian),因此需结合以下文件:

# 通用方法:读取发行版专用文件
cat /etc/os-release
# 输出关键行:PRETTY_NAME="Ubuntu 22.04.3 LTS"
# 针对旧版CentOS(需先安装redhat-lsb-core)
lsb_release -d

macOS特别处理
由于macOS基于Darwin内核,uname会返回Darwin 21.6.0,但用户更关心“macOS Ventura 13.6”,需使用:

sw_vers -productVersion   # 返回 13.6
sw_vers -buildVersion     # 返回 22G120

建议组合输出:系统名称: macOS $(sw_vers -productVersion) (Build $(sw_vers -buildVersion))

实战案例:一个兼容三端的Python脚本

以下脚本采用platform模块,无需调用外部命令,且自动解析版本字符串:

import platform
import sys
def get_os_info():
    system = platform.system()
    if system == "Windows":
        # 利用platform.win32_ver()返回(version, hostname, build)
        ver, _, build, _ = platform.win32_ver()
        return f"Windows {ver} (Build {build})"
    elif system == "Linux":
        # 优先读取/etc/os-release
        try:
            with open("/etc/os-release") as f:
                data = dict(line.strip().split("=", 1) for line in f if "=" in line)
            return f"{data['NAME']} {data['VERSION_ID']}"
        except:
            return f"Linux Kernel {platform.release()}"
    elif system == "Darwin":
        return f"macOS {platform.mac_ver()[0]}"
    else:
        return f"Unknown OS: {system}"
if __name__ == "__main__":
    print(f"脚本运行环境:{get_os_info()}")

执行效果

  • Windows:Windows 10 (Build 19045)
  • Ubuntu:Ubuntu 22.04
  • macOS:macOS 13.6

常见问答(FAQ)

Q1:为什么uname -a在部分Linux上不显示发行版名称?
A:uname输出内核与硬件架构,不识别发行版,必须结合/etc/os-release/etc/redhat-release等文件,若文件不存在,可安装lsb-release工具。

Q2:PowerShell脚本在Windows 7上运行报错怎么办?
A:Get-ComputerInfo仅支持Win8+/Server 2012+,Win7需改用Get-WmiObject Win32_OperatingSystem | Select-Object Caption,Version

Q3:如何获取Windows的补丁级别(KB编号)?
A:执行Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 5 HotFixID,但需管理员权限。

Q4:macOS下用sw_vers命令为何返回15.7
A:macOS 11及以上版本仍兼容十进制的数字命名,脚本中建议用正则匹配主版本号(如/^\d+\.\d+/)再进行映射。

Q5:脚本在容器(Docker)中无法获取宿主OS版本?
A:容器共享宿主机内核,但/etc/os-release对应的是容器镜像版本,如需宿主机信息,须挂载/host-etc目录或注入环境变量。

安全提示与最佳实践

  • 权限最小化:获取系统版本无需root权限,勿在脚本中使用sudoadmin提权,避免日志泄露敏感信息。
  • 输出规范化:建议统一JSON格式返回,方便日志系统解析,例如{"os":"windows","version":"10.0.19045"}
  • 超时控制:若使用远程命令(如SSH),需添加timeout 5防止主机无响应。
  • 测试矩阵:至少验证Windows 10/11、Ubuntu 20.04/22.04、macOS 12/13四类主流环境,避免硬编码字段差异。

通过脚本获取系统版本并非难事,但需兼顾平台差异与版本兼容性,掌握上述方法后,无论是编写自动化部署脚本,还是构建跨平台监控工具,都能游刃有余,建议将核心函数封装为独立模块,在团队内共享复用。

抱歉,评论功能暂时关闭!