用脚本高效获取设备管理信息的完整指南
📖 目录导读
- 为什么需要脚本获取设备管理信息? —— 传统方法与自动化对比
- 核心脚本语言选择 —— PowerShell vs Python vs Bash
- 实战:三种脚本获取设备信息的完整代码
- 常见问题问答(FAQ) —— 解决脚本执行中的高频报错
- 高阶技巧:批量采集、跨平台兼容与安全加固
为什么需要脚本获取设备管理信息?
在企业IT运维中,设备管理信息(如CPU型号、内存容量、磁盘使用率、网络配置、运行时间、已安装软件列表等)是故障排查、资产盘点、合规审计的基础,传统方式是通过远程桌面逐个登录,或使用“设备管理”面板手动导出——效率低、易遗漏、难以标准化。

脚本自动化的核心优势在于:
- 批量执行:一次编写,对数百台设备同时采集
- 数据格式化:直接输出为JSON/CSV,免去人工整理
- 定时抓拍:可嵌入计划任务,生成历史趋势数据
核心脚本语言选择
| 语言 | 适用环境 | 优点 | 缺点 |
|---|---|---|---|
| PowerShell | Windows | 直接调用WMI/CIM,无需额外安装 | 跨平台弱(可用PowerShell Core改善) |
| Python | 全平台 | 库丰富,社区活跃 | 需安装Python环境及psutil等库 |
| Bash | Linux/macOS | 开机即用,轻量 | 语法简洁但功能有限 |
建议组合:Windows主力用PowerShell,Linux/macOS用Bash或Python。
实战:三种脚本获取设备信息的完整代码
🔧 PowerShell 示例(Windows)
# 获取系统基础信息
$os = Get-CimInstance Win32_OperatingSystem
$cpu = Get-CimInstance Win32_Processor
$disk = Get-CimInstance Win32_LogicalDisk -Filter "DriveType=3"
$report = [PSCustomObject]@{
ComputerName = $env:COMPUTERNAME
OSName = $os.Caption
OSVersion = $os.Version
CPUName = $cpu.Name
CPUCores = $cpu.NumberOfCores
TotalMemoryGB = [math]::Round($os.TotalVisibleMemorySize/1MB, 2)
FreeMemoryGB = [math]::Round($os.FreePhysicalMemory/1MB, 2)
DiskC = $disk | Where-Object {$_.DeviceID -eq "C:"} | Select-Object @{N='SizeGB';E={[math]::Round($_.Size/1GB,2)}}, @{N='FreeGB';E={[math]::Round($_.FreeSpace/1GB,2)}}
UptimeDays = [math]::Round((Get-Date) - $os.LastBootUpTime).TotalDays
}
$report | Export-Csv -Path ".\DeviceInfo_$($env:COMPUTERNAME).csv" -NoTypeInformation
🐍 Python 示例(跨平台)
import psutil
import platform
import datetime
import json
def get_device_info():
boot_time = datetime.datetime.fromtimestamp(psutil.boot_time())
uptime = datetime.datetime.now() - boot_time
info = {
"hostname": platform.node(),
"os": f"{platform.system()} {platform.release()}",
"cpu": platform.processor(),
"cores": psutil.cpu_count(logical=False),
"ram_total_gb": round(psutil.virtual_memory().total / (1024**3), 2),
"ram_used_gb": round(psutil.virtual_memory().used / (1024**3), 2),
"disk_c_gb": round(psutil.disk_usage('/').total / (1024**3), 2),
"disk_c_free_gb": round(psutil.disk_usage('/').free / (1024**3), 2),
"uptime_days": round(uptime.total_seconds() / 86400, 1),
"ip": psutil.net_if_addrs().get('eth0', [{}])[0].address if 'eth0' in psutil.net_if_addrs() else 'N/A'
}
return info
if __name__ == "__main__":
data = get_device_info()
with open('device_info.json', 'w') as f:
json.dump(data, f, indent=4)
print("设备信息已保存至 device_info.json")
🐧 Bash 示例(Linux)
#!/bin/bash
echo "主机名: $(hostname)"
echo "操作系统: $(cat /etc/os-release | grep PRETTY_NAME | cut -d= -f2 | tr -d '\"')"
echo "CPU型号: $(lscpu | grep 'Model name' | awk -F': ' '{print $2}')"
echo "核心数: $(nproc)"
echo "内存总量: $(free -h | grep Mem | awk '{print $2}')"
echo "内存已用: $(free -h | grep Mem | awk '{print $3}')"
echo "根分区总大小: $(df -h / | tail -1 | awk '{print $2}')"
echo "根分区可用: $(df -h / | tail -1 | awk '{print $4}')"
echo "运行时间: $(uptime -p | sed 's/up //')"
echo "IP地址: $(hostname -I | awk '{print $1}')"
常见问题问答(FAQ)
❓ Q1: 脚本执行提示“找不到命令”?
A1:检查脚本语言是否安装,Windows下PowerShell默认可用;Python需确认 python --version 能返回版本;Bash需 chmod +x 赋予执行权限。
❓ Q2: 远程批量采集多台设备怎么办?
A2:两种方式:
- PowerShell:使用
Invoke-Command -ComputerName List.txt -ScriptBlock { 你的脚本 } - Python:搭配Paramiko库通过SSH连接目标设备,循环执行Bash脚本
❓ Q3: 采集信息中包含敏感数据(如IP、用户名)如何脱敏?
A3:在脚本输出前添加过滤逻辑,例如Python中:
if '192.168' in str(info['ip']):
info['ip'] = '***.***.***.***'
❓ Q4: 脚本输出乱码或格式错误?
A4:确保输出格式UTF-8,PowerShell加 -Encoding UTF8,Bash中 export LANG=en_US.UTF-8。
❓ Q5: 想定时自动采集,如何配置?
A5:Windows使用“任务计划程序”调用PowerShell脚本;Linux使用crontab:
crontab -e # 每天凌晨2点执行 0 2 * * * /path/to/your_script.sh >> /var/log/device_info.log 2>&1
高阶技巧:批量采集、跨平台兼容与安全加固
🚀 批量采集优化
- 使用清单文件:准备一个
computers.txt,每行一个IP或主机名 - 添加重试机制:遇到网络超时自动跳转设备,记录失败日志
- 结果聚合:将多个设备的JSON/CSV合并为一个总表,便于资产管理
🔒 安全注意事项
- 凭证管理:不要明文写密码,使用Windows凭据管理器或SSH密钥
- 最小权限原则:脚本使用专用服务账号,只授予WMI只读或SSH只读权限
- 输出脱敏:生产环境避免输出MAC地址、登录用户名等隐私字段
- 执行日志:记录谁在什么时间执行了脚本,便于审计追踪
🌐 跨平台兼容建议
- 统一输出格式:无论何种脚本,最终导出为JSON(标准且易于解析)
- 抽象接口层:使用Python的psutil库,它在Windows/Linux/macOS上表现一致
- 错误处理标准化:所有脚本返回退出码0(成功)、1(部分失败)、2(完全失败)