怎样用脚本获取系统信息?一文掌握跨平台高效采集技巧
目录导读
- 为什么要用脚本获取系统信息?
- 主流脚本语言与工具对比
- Bash脚本:Linux系统信息采集实战
- PowerShell脚本:Windows系统信息获取指南
- Python脚本:跨平台通用方案详解
- 常见问题与问答集锦
- 安全与性能优化建议
为什么要用脚本获取系统信息?
在日常运维、开发调试、系统审计或自动化部署中,快速获取系统信息(CPU使用率、内存占用、磁盘空间、网络状态、硬件配置、进程列表等)是刚需,手动通过图形界面点选或逐条命令行查询不仅效率低下,还难以批量处理,而通过脚本,你可以:

- 自动化采集:定时执行、触发式采集,无需人工干预。
- 跨服务器批量操作:配合远程执行工具(如Ansible、SSH)一次性获取上百台设备信息。
- 数据格式化输出:生成JSON、CSV、HTML报告,便于后续可视化或入库。
- 诊断与预警:根据信息阈值自动报警(如磁盘超90%)。
脚本的本质:调用操作系统底层命令或API,将结构化结果处理成你需要的格式。
主流脚本语言与工具对比
| 语言/工具 | 适用场景 | 优势 | 劣势 |
|---|---|---|---|
| Bash/Shell | Linux/Unix环境 | 系统预装无依赖,执行效率高 | 跨平台弱(Windows需WSL) |
| PowerShell | Windows环境为主 | 深度集成.NET,对象化输出 | Linux可用但体验稍弱 |
| Python | 全平台通用 | 丰富库(psutil, platform),开发快 | 需安装Python运行时 |
选择建议:若长期维护单一平台,优先选原生脚本;若需跨平台或二次开发复杂逻辑,Python是通用最优解。
Bash脚本:Linux系统信息采集实战
核心思路:组合系统命令 + 文本处理工具(awk/sed/grep)
#!/bin/bash
# 系统信息采集脚本示例
echo "========= 系统基本信息 ========="
echo "主机名: $(hostname)"
echo "操作系统: $(uname -a)"
echo "内核版本: $(uname -r)"
echo "运行时间: $(uptime -s)"
echo "\n========= CPU 信息 ========="
echo "型号: $(grep 'model name' /proc/cpuinfo | head -1 | awk -F: '{print $2}')"
echo "核心数: $(nproc)"
echo "平均负载: $(top -bn1 | grep 'load average' | awk '{print $12$13$14}')"
echo "\n========= 内存信息 ========="
free -h | awk 'NR==2{printf "总内存: %s\t已用: %s\t剩余: %s\n", $2, $3, $4}'
echo "\n========= 磁盘信息 ========="
df -h | grep -E '^/dev/' | awk '{print $1, $2, $3, $4, $5, $6}'
echo "\n========= 网络信息 ========="
ip -br addr | awk '{print $1, $3}'
运行方式:chmod +x sys_info.sh && ./sys_info.sh
进阶技巧:用watch -n 5 ./sys_info.sh实现每5秒刷新,或用cron定时执行写入日志。
PowerShell脚本:Windows系统信息获取指南
核心思路:利用WMI/CIM类或Get-*命令
# 系统信息采集脚本示例
Write-Host "========= 系统基本信息 ========="
Write-Host "计算机名: $env:COMPUTERNAME"
Write-Host "操作系统: $(Get-CimInstance Win32_OperatingSystem).Caption"
Write-Host "系统目录: $env:SYSTEMROOT"
Write-Host "`n========= CPU 信息 ========="
$cpu = Get-CimInstance Win32_Processor
Write-Host "名称: $($cpu.Name)"
Write-Host "核心数: $($cpu.NumberOfCores)"
Write-Host "逻辑处理器: $($cpu.NumberOfLogicalProcessors)"
Write-Host "`n========= 内存信息 ========="
$os = Get-CimInstance Win32_OperatingSystem
Write-Host "总内存: $([math]::Round($os.TotalVisibleMemorySize/1MB, 2)) GB"
Write-Host "可用内存: $([math]::Round($os.FreePhysicalMemory/1MB, 2)) GB"
Write-Host "`n========= 磁盘信息 ========="
Get-CimInstance Win32_LogicalDisk -Filter "DriveType=3" |
Select-Object DeviceID, @{N='Size(GB)';E={[math]::Round($_.Size/1GB,2)}},
@{N='Free(GB)';E={[math]::Round($_.FreeSpace/1GB,2)}}
Write-Host "`n========= 网络信息 ========="
Get-NetIPAddress -AddressFamily IPv4 | Select-Object InterfaceAlias, IPAddress
运行方式:在PowerShell ISE或终端执行,或保存为.ps1文件后运行。
优势:输出为对象(可管道处理),轻松导出为CSV:.\sys_info.ps1 | Export-Csv report.csv
Python脚本:跨平台通用方案详解
核心思路:psutil库(跨平台系统信息神器) + platform
安装依赖:pip install psutil
#!/usr/bin/env python3
# 跨平台系统信息采集脚本
import psutil
import platform
from datetime import datetime
def get_system_info():
info = {}
# 基本信息
info['hostname'] = platform.node()
info['os'] = f"{platform.system()} {platform.release()}"
info['kernel'] = platform.version()
info['uptime'] = datetime.fromtimestamp(psutil.boot_time()).isoformat()
# CPU信息
info['cpu_physical_cores'] = psutil.cpu_count(logical=False)
info['cpu_total_cores'] = psutil.cpu_count(logical=True)
info['cpu_percent'] = psutil.cpu_percent(interval=1)
info['cpu_freq'] = psutil.cpu_freq().current if psutil.cpu_freq() else None
# 内存信息
mem = psutil.virtual_memory()
info['memory_total'] = round(mem.total / (1024**3), 2) # GB
info['memory_available'] = round(mem.available / (1024**3), 2)
info['memory_percent'] = mem.percent
# 磁盘信息
disks = []
for part in psutil.disk_partitions():
if 'cdrom' in part.opts or part.fstype == '':
continue
usage = psutil.disk_usage(part.mountpoint)
disks.append({
'device': part.device,
'mount': part.mountpoint,
'total': round(usage.total / (1024**3), 2),
'used': round(usage.used / (1024**3), 2),
'free': round(usage.free / (1024**3), 2),
'percent': usage.percent
})
info['disks'] = disks
# 网络信息
net_addrs = psutil.net_if_addrs()
net_info = {}
for iface, addrs in net_addrs.items():
for addr in addrs:
if addr.family == 2: # IPv4
net_info[iface] = addr.address
info['network'] = net_info
return info
if __name__ == '__main__':
import json
info = get_system_info()
print(json.dumps(info, indent=2, ensure_ascii=False))
输出示例(JSON格式):
{
"hostname": "server01",
"os": "Linux 5.15.0",
"cpu_percent": 23.5,
"memory_total": 15.62,
"disks": [...]
}
扩展性:可轻松集成requests库将数据POST至监控系统,或用matplotlib生成图表。
常见问题与问答集锦
Q1:脚本运行时无权限怎么办?
A:Linux下用chmod +x script.sh赋予执行权限;PowerShell需执行Set-ExecutionPolicy RemoteSigned;Python确保目录有读写权限。
Q2:如何让脚本定时自动执行?
A:Linux用crontab -e(如*/5 * * * * /path/to/script.sh);Windows用“任务计划程序”;Python可搭配schedule库。
Q3:脚本输出乱码(如中文)如何解决?
A:Bash脚本首行加export LANG=en_US.UTF-8;PowerShell用[Console]::OutputEncoding = [Text.Encoding]::UTF8;Python文件头加# -*- coding: utf-8 -*-。
Q4:如何仅获取特定信息(如磁盘使用率>90%)?
A:在脚本中加入条件判断(如Bash的if [ $usage -ge 90 ];Python的if disk['percent'] > 90:),然后只输出预警信息。
Q5:跨平台脚本兼容性要注意什么?
A:路径分隔符(Windows用,Linux用)、命令差异(如ipconfig vs ip addr)、换行符(\r\n vs \n),建议用Python的os.path.join和platform.system()做分支处理。
Q6:脚本运行时卡死或消耗资源过高?
A:避免写循环读取(如while true不加sleep),CPU采样建议间隔至少1秒;磁盘扫描可添加timeout限制。
安全与性能优化建议
- 日志脱敏:避免明文显示IP地址、主机名中敏感后缀(如内部域名),可将输出用
sed 's/192\.168\.\d+\.\d+/***/g'替换。 - 错误处理:每条关键命令前加
|| echo "命令失败"或Python的try-except,防止中途中断。 - 增量采集:对比上次采集结果,仅报告变化部分(如磁盘空间减少5%以上)。
- 加密传输:若需远程传输,使用SSH隧道或HTTPS,避免日志被中间人窃取。
- 资源限制:用
ulimit限制脚本CPU/内存使用(如ulimit -t 30仅允许运行30秒)。
通过以上三种语言的实战示例和问答,你已经掌握了怎样用脚本获取系统信息的核心方法,从命令行一键执行到定时自动化采集,从单机到集群,脚本化是提升运维效率的捷径,建议从你的实际需求出发,选择最契合的语言,先实现一个“最小可用版本”,再逐步丰富功能。