如何写一个脚本自动收集诊断

wen 实用脚本 2

本文目录导读:

如何写一个脚本自动收集诊断

  1. Linux 系统诊断收集脚本
  2. Windows 系统诊断收集脚本 (PowerShell)
  3. 用法说明
  4. 增强版本(带参数和错误处理)

我来帮您编写一个自动收集诊断信息的脚本,这里提供几个常用系统的版本:

Linux 系统诊断收集脚本

#!/bin/bash
# 系统诊断信息收集脚本
# 文件名: collect_diagnostics.sh
# 设置输出目录
OUTPUT_DIR="./diagnostics_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$OUTPUT_DIR"
echo "开始收集系统诊断信息..."
# 1. 系统基本信息
echo "=== 系统基本信息 ===" > "$OUTPUT_DIR/system_info.txt"
uname -a >> "$OUTPUT_DIR/system_info.txt"
cat /etc/os-release 2>/dev/null >> "$OUTPUT_DIR/system_info.txt"
echo "主机名: $(hostname)" >> "$OUTPUT_DIR/system_info.txt"
# 2. CPU 信息
echo "=== CPU 信息 ===" > "$OUTPUT_DIR/cpu_info.txt"
lscpu >> "$OUTPUT_DIR/cpu_info.txt"
echo "CPU 使用率:" >> "$OUTPUT_DIR/cpu_info.txt"
top -bn1 | head -5 >> "$OUTPUT_DIR/cpu_info.txt"
# 3. 内存信息
echo "=== 内存信息 ===" > "$OUTPUT_DIR/memory_info.txt"
free -h >> "$OUTPUT_DIR/memory_info.txt"
echo -e "\n内存详细:" >> "$OUTPUT_DIR/memory_info.txt"
cat /proc/meminfo >> "$OUTPUT_DIR/memory_info.txt"
# 4. 磁盘信息
echo "=== 磁盘信息 ===" > "$OUTPUT_DIR/disk_info.txt"
df -h >> "$OUTPUT_DIR/disk_info.txt"
echo -e "\n磁盘分区:" >> "$OUTPUT_DIR/disk_info.txt"
lsblk >> "$OUTPUT_DIR/disk_info.txt"
# 5. 网络信息
echo "=== 网络信息 ===" > "$OUTPUT_DIR/network_info.txt"
ip addr >> "$OUTPUT_DIR/network_info.txt"
echo -e "\n路由表:" >> "$OUTPUT_DIR/network_info.txt"
route -n >> "$OUTPUT_DIR/network_info.txt"
echo -e "\nDNS 配置:" >> "$OUTPUT_DIR/network_info.txt"
cat /etc/resolv.conf >> "$OUTPUT_DIR/network_info.txt"
# 6. 进程信息
echo "=== 进程信息 ===" > "$OUTPUT_DIR/process_info.txt"
ps aux --sort=-%cpu | head -20 >> "$OUTPUT_DIR/process_info.txt"
echo -e "\n\n内存占用前10:" >> "$OUTPUT_DIR/process_info.txt"
ps aux --sort=-%mem | head -11 >> "$OUTPUT_DIR/process_info.txt"
# 7. 服务状态
echo "=== 服务状态 ===" > "$OUTPUT_DIR/services_info.txt"
systemctl list-units --type=service --state=running >> "$OUTPUT_DIR/services_info.txt"
# 8. 日志信息(最近100条)
echo "=== 系统日志 ===" > "$OUTPUT_DIR/system_logs.txt"
journalctl -n 100 --no-pager >> "$OUTPUT_DIR/system_logs.txt"
# 9. 安全信息
echo "=== 安全信息 ===" > "$OUTPUT_DIR/security_info.txt"
echo "登录用户:" >> "$OUTPUT_DIR/security_info.txt"
who >> "$OUTPUT_DIR/security_info.txt"
echo -e "\n最近登录:" >> "$OUTPUT_DIR/security_info.txt"
last -5 >> "$OUTPUT_DIR/security_info.txt"
# 10. 打包诊断文件
echo "正在打包诊断文件..."
tar -czf "${OUTPUT_DIR}.tar.gz" -C "$OUTPUT_DIR" .
echo "诊断收集完成!文件保存在: ${OUTPUT_DIR}.tar.gz"
# 清理临时文件
rm -rf "$OUTPUT_DIR"

Windows 系统诊断收集脚本 (PowerShell)

# 系统诊断信息收集脚本
# 文件名: collect_diagnostics.ps1
$outputDir = "diagnostics_$(Get-Date -Format 'yyyyMMdd_HHmmss')"
New-Item -ItemType Directory -Path $outputDir -Force | Out-Null
Write-Host "开始收集系统诊断信息..." -ForegroundColor Green
# 1. 系统基本信息
Get-ComputerInfo | Out-File "$outputDir\system_info.txt"
# 2. CPU 信息
Get-CimInstance Win32_Processor | Format-List * | Out-File "$outputDir\cpu_info.txt"
Get-Process | Sort-Object CPU -Descending | Select-Object -First 10 | 
    Format-Table Name, CPU, WorkingSet, StartTime | Out-File "$outputDir\process_cpu.txt"
# 3. 内存信息
Get-CimInstance Win32_OperatingSystem | 
    Select-Object TotalVisibleMemorySize, FreePhysicalMemory, TotalVirtualMemorySize, FreeVirtualMemory |
    Format-Table | Out-File "$outputDir\memory_info.txt"
# 4. 磁盘信息
Get-CimInstance Win32_LogicalDisk -Filter "DriveType=3" | 
    Select-Object DeviceID, @{Name="Size(GB)";Expression={[math]::Round($_.Size/1GB,2)}},
    @{Name="FreeSpace(GB)";Expression={[math]::Round($_.FreeSpace/1GB,2)}} |
    Format-Table | Out-File "$outputDir\disk_info.txt"
# 5. 网络信息
Get-NetAdapter | Format-Table Name, Status, LinkSpeed, MacAddress | Out-File "$outputDir\network_info.txt"
Get-NetIPAddress | Where-Object AddressFamily -eq IPv4 | 
    Select-Object InterfaceAlias, IPAddress, PrefixLength | 
    Format-Table | Out-File -Append "$outputDir\network_info.txt"
# 6. 服务状态
Get-Service | Where-Object Status -eq "Running" | 
    Select-Object Name, DisplayName, Status | 
    Format-Table | Out-File "$outputDir\services_info.txt"
# 7. 事件日志(最近100条系统日志)
Get-EventLog -LogName System -Newest 100 | 
    Select-Object TimeGenerated, EntryType, Source, Message | 
    Format-Table -Wrap | Out-File "$outputDir\system_logs.txt"
# 8. 硬件信息
Get-CimInstance Win32_SystemEnclosure | 
    Select-Object Manufacturer, Model, SerialNumber | 
    Format-Table | Out-File "$outputDir\hardware_info.txt"
# 打包
Compress-Archive -Path "$outputDir\*" -DestinationPath "$outputDir.zip"
Write-Host "诊断收集完成!文件保存在: $outputDir.zip" -ForegroundColor Green
Remove-Item -Path $outputDir -Recurse -Force

用法说明

Linux 系统:

# 赋予执行权限
chmod +x collect_diagnostics.sh
# 运行脚本
./collect_diagnostics.sh

Windows 系统:

# 如果执行策略限制,先设置
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
# 运行脚本
.\collect_diagnostics.ps1

增强版本(带参数和错误处理)

#!/bin/bash
# 增强版诊断收集脚本
VERSION="1.0"
usage() {
    echo "用法: $0 [选项]"
    echo "选项:"
    echo "  -o, --output DIR    指定输出目录"
    echo "  -l, --log-count N   收集的日志数量(默认100)"
    echo "  -v, --verbose       详细输出"
    echo "  -h, --help          显示帮助信息"
    exit 1
}
# 参数解析
while [[ $# -gt 0 ]]; do
    case $1 in
        -o|--output)
            OUTPUT_DIR="$2"
            shift 2
            ;;
        -l|--log-count)
            LOG_COUNT="$2"
            shift 2
            ;;
        -v|--verbose)
            VERBOSE=true
            shift
            ;;
        -h|--help)
            usage
            ;;
        *)
            echo "未知参数: $1"
            usage
            ;;
    esac
done
# 设置默认值
OUTPUT_DIR=${OUTPUT_DIR:-"./diagnostics_$(date +%Y%m%d_%H%M%S)"}
LOG_COUNT=${LOG_COUNT:-100}
# 检查命令是否存在
check_command() {
    if ! command -v $1 &> /dev/null; then
        echo "警告: 命令 $1 未找到"
        return 1
    fi
    return 0
}
# 主函数
main() {
    echo "诊断收集工具 v$VERSION"
    echo "输出目录: $OUTPUT_DIR"
    mkdir -p "$OUTPUT_DIR" || {
        echo "错误: 无法创建输出目录"
        exit 1
    }
    # 收集信息...
    # (这里插入上面的诊断收集代码)
    # 错误处理示例
    if [ $? -eq 0 ]; then
        echo "诊断收集成功完成"
    else
        echo "诊断收集过程中出现错误"
        exit 1
    fi
}
main

这些脚本可以:

  • 收集系统核心信息
  • 自动生成时间戳文件
  • 打包压缩便于传输
  • 添加了错误处理和参数选项

根据您的具体需求,可以调整收集的内容和格式。

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