本文目录导读:

我来介绍几种生成系统报告的方法,包含不同场景的脚本方案:
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: 使用
wkhtmltopdf或reportlab库 - Excel: 使用
pandas+openpyxl - HTML邮件: 使用
smtplib发送HTML格式报告
这些脚本可以根据具体需求进行调整和扩展,需要我帮您定制特定的报告功能吗?