如何用脚本生成系统报告

wen 实用脚本 2

本文目录导读:

如何用脚本生成系统报告

  1. Linux 系统报告脚本
  2. Windows 系统报告脚本
  3. 跨平台 Python 脚本
  4. 定时生成报告(Cron任务)
  5. 使用说明

我来介绍几种生成系统报告的方法,包含不同场景的脚本方案:

Linux 系统报告脚本

基础系统信息报告

#!/bin/bash
# system_report.sh - 生成系统基础信息报告
REPORT_FILE="system_report_$(date +%Y%m%d_%H%M%S).txt"
{
echo "========================================"
echo "     系统报告 - $(date)"
echo "========================================"
# 系统信息
echo -e "\n【系统信息】"
echo "主机名: $(hostname)"
echo "操作系统: $(cat /etc/os-release | grep PRETTY_NAME | cut -d'"' -f2)"
echo "内核版本: $(uname -r)"
echo "运行时间: $(uptime -p)"
# 硬件信息
echo -e "\n【硬件信息】"
echo "CPU型号: $(lscpu | grep 'Model name' | cut -d':' -f2 | xargs)"
echo "CPU核心数: $(nproc)"
echo "内存总量: $(free -h | awk '/^Mem:/ {print $2}')"
echo "磁盘使用: $(df -h / | awk 'NR==2 {print $3"/"$2" ("$5")"}')"
# 网络信息
echo -e "\n【网络信息】"
echo "IP地址: $(hostname -I)"
echo "网关: $(ip route | grep default | awk '{print $3}')"
echo "DNS: $(cat /etc/resolv.conf | grep nameserver | awk '{print $2}' | tr '\n' ' ')"
# 系统负载
echo -e "\n【系统负载】"
echo "1分钟负载: $(uptime | awk -F'load average:' '{print $2}' | cut -d',' -f1)"
echo "5分钟负载: $(uptime | awk -F'load average:' '{print $2}' | cut -d',' -f2)"
echo "15分钟负载: $(uptime | awk -F'load average:' '{print $2}' | cut -d',' -f3)"
# 进程信息
echo -e "\n【进程信息】"
echo "总进程数: $(ps aux | wc -l)"
echo "CPU占用TOP5:"
ps aux --sort=-%cpu | head -6 | awk '{printf "  %-10s %-8s %s\n", $1, $3"%", $11}'
# 服务状态
echo -e "\n【关键服务状态】"
for service in sshd nginx mysql docker; do
    if systemctl is-active $service 2>/dev/null | grep -q active; then
        echo "  $service: 运行中"
    else
        echo "  $service: 未运行"
    fi
done
echo -e "\n========================================"
echo "报告生成完成: $(date)"
echo "========================================"
} > "$REPORT_FILE"
echo "报告已保存到: $REPORT_FILE"

资源监控报告(含图表)

#!/bin/bash
# resource_report.sh - 生成资源使用趋势报告
REPORT_FILE="resource_report_$(date +%Y%m%d).html"
LOG_FILE="/tmp/resource.log"
# 收集6小时数据(每10分钟)
echo "开始收集资源数据..."
for i in {1..36}; do
    CPU=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
    MEM=$(free | grep Mem | awk '{printf "%.1f", $3/$2*100}')
    DISK=$(df -h / | awk 'NR==2 {print $5}' | cut -d'%' -f1)
    echo "$(date +%H:%M),$CPU,$MEM,$DISK" >> "$LOG_FILE"
    sleep 600
done
# 生成HTML报告
{
cat << EOF
<!DOCTYPE html>
<html>
<head>系统资源报告</title>
    <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
</head>
<body>
<h1>系统资源使用报告 - $(date)</h1>
<canvas id="cpuChart" width="800" height="400"></canvas>
<canvas id="memChart" width="800" height="400"></canvas>
<canvas id="diskChart" width="800" height="400"></canvas>
<script>
const data = [
EOF
# 添加数据点
while IFS=, read -r time cpu mem disk; do
    echo "{ time: '$time', cpu: $cpu, mem: $mem, disk: $disk },"
done < "$LOG_FILE"
cat << EOF
];
// 创建图表
new Chart(document.getElementById('cpuChart'), {
    type: 'line',
    data: { datasets: [{ label: 'CPU%', data: data.map(d => d.cpu), borderColor: '#ff6384' }] }
});
// 其他图表类似...
</script>
</body>
</html>
EOF
} > "$REPORT_FILE"
echo "HTML报告已生成: $REPORT_FILE"

Windows 系统报告脚本

# system_report.ps1 - Windows系统报告
$reportDate = Get-Date -Format "yyyyMMdd_HHmmss"
$reportFile = "C:\Reports\system_report_$reportDate.txt"
# 创建报告目录
New-Item -ItemType Directory -Path "C:\Reports" -Force | Out-Null
{
    Write-Host "========================================"
    Write-Host "Windows 系统报告 - $(Get-Date)"
    Write-Host "========================================"
    # 系统信息
    Write-Host "`n【系统信息】"
    $os = Get-CimInstance Win32_OperatingSystem
    Write-Host "系统: $($os.Caption) $($os.Version)"
    Write-Host "主机名: $env:COMPUTERNAME"
    Write-Host "最后启动: $($os.LastBootUpTime)"
    # CPU信息
    Write-Host "`n【CPU信息】"
    $cpu = Get-CimInstance Win32_Processor
    Write-Host "CPU: $($cpu.Name)"
    Write-Host "核心数: $($cpu.NumberOfCores)"
    Write-Host "使用率: $((Get-Counter '\Processor(_Total)\% Processor Time').CounterSamples.CookedValue)%"
    # 内存信息
    Write-Host "`n【内存信息】"
    $mem = Get-CimInstance Win32_ComputerSystem
    $totalMem = [math]::Round($mem.TotalPhysicalMemory / 1GB)
    $freeMem = [math]::Round((Get-CimInstance Win32_OperatingSystem).FreePhysicalMemory / 1MB)
    Write-Host "总内存: ${totalMem}GB"
    Write-Host "可用内存: ${freeMem}GB"
    Write-Host "使用率: $([math]::Round((($totalMem - $freeMem) / $totalMem) * 100))%"
    # 磁盘信息
    Write-Host "`n【磁盘信息】"
    Get-CimInstance Win32_LogicalDisk -Filter "DriveType=3" | ForEach-Object {
        Write-Host "磁盘 $($_.DeviceID): $([math]::Round($_.Size/1GB))GB 总量, $([math]::Round($_.FreeSpace/1GB))GB 可用"
    }
    # 网络配置
    Write-Host "`n【网络配置】"
    Get-NetIPAddress -AddressFamily IPv4 | Where-Object {$_.InterfaceAlias -notlike "*Loopback*"} | ForEach-Object {
        Write-Host "$($_.InterfaceAlias): $($_.IPAddress)"
    }
    # 运行中的服务
    Write-Host "`n【运行中的服务】"
    Get-Service | Where-Object {$_.Status -eq "Running"} | Select-Object -First 10 | ForEach-Object {
        Write-Host "  $($_.Name): $($_.DisplayName)"
    }
    Write-Host "`n========================================"
    Write-Host "报告生成完成"
    Write-Host "========================================"
} | Out-File $reportFile -Encoding UTF8
Write-Host "报告已保存到: $reportFile"

跨平台 Python 脚本

#!/usr/bin/env python3
# system_report.py - 跨平台系统报告生成器
import platform
import psutil
import datetime
import socket
import json
import os
import subprocess
def get_system_info():
    """收集系统信息"""
    info = {}
    # 基础信息
    info['timestamp'] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    info['hostname'] = socket.gethostname()
    info['os'] = platform.platform()
    info['python_version'] = platform.python_version()
    # CPU信息
    info['cpu_count'] = psutil.cpu_count()
    info['cpu_percent'] = psutil.cpu_percent(interval=1)
    info['cpu_freq'] = psutil.cpu_freq().current if hasattr(psutil.cpu_freq(), 'current') else 'N/A'
    # 内存信息
    mem = psutil.virtual_memory()
    info['memory_total'] = mem.total / (1024**3)  # GB
    info['memory_used'] = mem.used / (1024**3)
    info['memory_percent'] = mem.percent
    # 磁盘信息
    disk = psutil.disk_usage('/')
    info['disk_total'] = disk.total / (1024**3)
    info['disk_used'] = disk.used / (1024**3)
    info['disk_percent'] = disk.percent
    # 网络信息
    net = psutil.net_io_counters()
    info['network_sent'] = net.bytes_sent / (1024**2)  # MB
    info['network_recv'] = net.bytes_recv / (1024**2)
    # 进程信息
    processes = []
    for proc in psutil.process_iter(['pid', 'name', 'cpu_percent', 'memory_percent']):
        try:
            processes.append(proc.info)
        except:
            pass
    info['top_processes'] = sorted(processes, key=lambda x: x['cpu_percent'] if x['cpu_percent'] else 0, reverse=True)[:5]
    return info
def generate_text_report(info):
    """生成文本报告"""
    report = []
    report.append("=" * 50)
    report.append(f"系统报告 - {info['timestamp']}")
    report.append("=" * 50)
    report.append(f"\n主机名: {info['hostname']}")
    report.append(f"操作系统: {info['os']}")
    report.append("\n【CPU信息】")
    report.append(f"核心数: {info['cpu_count']}")
    report.append(f"使用率: {info['cpu_percent']}%")
    report.append(f"频率: {info['cpu_freq']}MHz")
    report.append("\n【内存信息】")
    report.append(f"总量: {info['memory_total']:.2f}GB")
    report.append(f"已用: {info['memory_used']:.2f}GB")
    report.append(f"使用率: {info['memory_percent']}%")
    report.append("\n【磁盘信息】")
    report.append(f"总量: {info['disk_total']:.2f}GB")
    report.append(f"已用: {info['disk_used']:.2f}GB")
    report.append(f"使用率: {info['disk_percent']}%")
    report.append("\n【网络信息】")
    report.append(f"发送: {info['network_sent']:.2f}MB")
    report.append(f"接收: {info['network_recv']:.2f}MB")
    report.append("\n【CPU占用TOP5进程】")
    for i, proc in enumerate(info['top_processes'], 1):
        report.append(f"  {i}. {proc['name']}: {proc['cpu_percent']}%")
    report.append("\n" + "=" * 50)
    return "\n".join(report)
def save_report(content, format='txt'):
    """保存报告"""
    filename = f"system_report_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.{format}"
    with open(filename, 'w', encoding='utf-8') as f:
        f.write(content)
    print(f"报告已保存到: {filename}")
    return filename
if __name__ == "__main__":
    # 收集信息
    system_info = get_system_info()
    # 生成文本报告
    text_report = generate_text_report(system_info)
    save_report(text_report, 'txt')
    # 生成JSON报告(可选)
    json_report = json.dumps(system_info, indent=2, ensure_ascii=False)
    save_report(json_report, 'json')

定时生成报告(Cron任务)

# 每天凌晨2点生成报告,并发送到指定邮箱
0 2 * * * /path/to/system_report.sh && mail -s "Daily System Report" admin@example.com < /path/to/reports/system_report_$(date +\%Y\%m\%d).txt

使用说明

执行权限和运行方式

# Linux/Mac
chmod +x system_report.sh
./system_report.sh
# Windows PowerShell
powershell -ExecutionPolicy Bypass -File system_report.ps1
# Python
python3 system_report.py

输出格式升级(可选)

要输出为PDF或Excel,可以使用:

  • PDF: 使用 wkhtmltopdfreportlab
  • Excel: 使用 pandas + openpyxl
  • HTML邮件: 使用 smtplib 发送HTML格式报告

这些脚本可以根据具体需求进行调整和扩展,需要我帮您定制特定的报告功能吗?

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