怎样用脚本获取系统信息?

wen 实用脚本 3

怎样用脚本获取系统信息?一文掌握跨平台高效采集技巧

目录导读

  1. 为什么要用脚本获取系统信息?
  2. 主流脚本语言与工具对比
  3. Bash脚本:Linux系统信息采集实战
  4. PowerShell脚本:Windows系统信息获取指南
  5. Python脚本:跨平台通用方案详解
  6. 常见问题与问答集锦
  7. 安全与性能优化建议

为什么要用脚本获取系统信息?

在日常运维、开发调试、系统审计或自动化部署中,快速获取系统信息(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.joinplatform.system()做分支处理。

Q6:脚本运行时卡死或消耗资源过高?
A:避免写循环读取(如while true不加sleep),CPU采样建议间隔至少1秒;磁盘扫描可添加timeout限制。


安全与性能优化建议

  1. 日志脱敏:避免明文显示IP地址、主机名中敏感后缀(如内部域名),可将输出用sed 's/192\.168\.\d+\.\d+/***/g'替换。
  2. 错误处理:每条关键命令前加|| echo "命令失败"或Python的try-except,防止中途中断。
  3. 增量采集:对比上次采集结果,仅报告变化部分(如磁盘空间减少5%以上)。
  4. 加密传输:若需远程传输,使用SSH隧道或HTTPS,避免日志被中间人窃取。
  5. 资源限制:用ulimit限制脚本CPU/内存使用(如ulimit -t 30仅允许运行30秒)。

通过以上三种语言的实战示例和问答,你已经掌握了怎样用脚本获取系统信息的核心方法,从命令行一键执行到定时自动化采集,从单机到集群,脚本化是提升运维效率的捷径,建议从你的实际需求出发,选择最契合的语言,先实现一个“最小可用版本”,再逐步丰富功能。

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