本文目录导读:

我来为您提供一个完善的定时系统快照脚本,这个脚本支持Windows和Linux系统。
Linux 系统快照脚本
#!/bin/bash
# Linux系统定时快照脚本
# 配置变量
SNAPSHOT_DIR="/var/backups/system_snapshots"
RETENTION_DAYS=7
LOG_FILE="/var/log/snapshot.log"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
SNAPSHOT_NAME="system_snapshot_${TIMESTAMP}"
# 确保目录存在
mkdir -p "$SNAPSHOT_DIR"
# 日志函数
log_message() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}
# 检查是否有root权限
if [[ $EUID -ne 0 ]]; then
log_message "错误:需要root权限运行此脚本"
exit 1
}
# 创建快照函数
create_snapshot() {
log_message "开始创建系统快照..."
# 创建临时目录
TEMP_DIR="${SNAPSHOT_DIR}/${SNAPSHOT_NAME}"
mkdir -p "$TEMP_DIR"
# 备份关键系统信息
echo "=== 系统信息 ===" > "${TEMP_DIR}/system_info.txt"
echo "时间: $(date)" >> "${TEMP_DIR}/system_info.txt"
uname -a >> "${TEMP_DIR}/system_info.txt"
echo "" >> "${TEMP_DIR}/system_info.txt"
echo "=== 系统负载 ===" >> "${TEMP_DIR}/system_info.txt"
uptime >> "${TEMP_DIR}/system_info.txt"
echo "" >> "${TEMP_DIR}/system_info.txt"
echo "=== 内存使用 ===" >> "${TEMP_DIR}/system_info.txt"
free -h >> "${TEMP_DIR}/system_info.txt"
echo "" >> "${TEMP_DIR}/system_info.txt"
echo "=== 磁盘使用 ===" >> "${TEMP_DIR}/system_info.txt"
df -h >> "${TEMP_DIR}/system_info.txt"
echo "" >> "${TEMP_DIR}/system_info.txt"
# 备份系统配置
cp /etc/passwd "${TEMP_DIR}/etc_passwd.bak"
cp /etc/group "${TEMP_DIR}/etc_group.bak"
cp /etc/shadow "${TEMP_DIR}/etc_shadow.bak"
cp /etc/resolv.conf "${TEMP_DIR}/etc_resolv.conf.bak"
cp /etc/hosts "${TEMP_DIR}/etc_hosts.bak"
cp /etc/fstab "${TEMP_DIR}/etc_fstab.bak"
# 备份分区表
sfdisk -d /dev/sda > "${TEMP_DIR}/partition_table.bak" 2>/dev/null || true
# 备份包列表
dpkg --get-selections > "${TEMP_DIR}/package_list.bak" 2>/dev/null ||
rpm -qa > "${TEMP_DIR}/package_list.bak" 2>/dev/null || true
# 备份crontab
crontab -l > "${TEMP_DIR}/crontab.bak" 2>/dev/null || true
# 压缩快照
tar -czf "${SNAPSHOT_DIR}/${SNAPSHOT_NAME}.tar.gz" -C "${SNAPSHOT_DIR}" "$SNAPSHOT_NAME"
# 删除临时目录
rm -rf "$TEMP_DIR"
log_message "快照 ${SNAPSHOT_NAME}.tar.gz 创建成功"
}
# 清理旧快照函数
cleanup_old_snapshots() {
log_message "清理 ${RETENTION_DAYS} 天前的旧快照..."
# 找出并删除旧快照
find "$SNAPSHOT_DIR" -name "*.tar.gz" -mtime +"$RETENTION_DAYS" -exec rm -f {} \;
# 记录清理结果
CLEANUP_COUNT=$(find "$SNAPSHOT_DIR" -name "*.tar.gz" -mtime +"$RETENTION_DAYS" | wc -l)
log_message "清理完成,删除了 $CLEANUP_COUNT 个旧快照"
# 显示剩余快照
echo "当前保留的快照:"
ls -lh "$SNAPSHOT_DIR"/*.tar.gz 2>/dev/null || echo "没有快照文件"
}
# 主函数
main() {
log_message "系统快照脚本启动"
# 创建快照
create_snapshot
# 清理旧快照
cleanup_old_snapshots
log_message "系统快照脚本执行完成"
}
# 执行主函数
main
Windows 系统快照脚本 (PowerShell)
# Windows系统定时快照脚本
# 文件名: create-snapshot.ps1
# 配置参数
$SnapshotDir = "C:\SystemSnapshots"
$RetentionDays = 7
$LogFile = "C:\SystemSnapshots\snapshot.log"
$Timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
$SnapshotName = "system_snapshot_$Timestamp"
$SnapshotPath = "$SnapshotDir\$SnapshotName"
# 日志函数
function Write-Log {
param([string]$Message)
$LogTime = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
"[$LogTime] $Message" | Out-File -FilePath $LogFile -Append
Write-Host "[$LogTime] $Message"
}
# 确保目录存在
if (!(Test-Path $SnapshotDir)) {
New-Item -ItemType Directory -Path $SnapshotDir -Force | Out-Null
Write-Log "创建快照目录: $SnapshotDir"
}
# 创建系统信息快照
function Create-SystemInfoSnapshot {
Write-Log "开始收集系统信息..."
# 创建快照目录
New-Item -ItemType Directory -Path $SnapshotPath -Force | Out-Null
# 系统基本信息
$SystemInfo = @{
Timestamp = Get-Date
ComputerName = $env:COMPUTERNAME
OS = (Get-WmiObject Win32_OperatingSystem).Caption
Version = (Get-WmiObject Win32_OperatingSystem).Version
LastBootTime = (Get-WmiObject Win32_OperatingSystem).LastBootUpTime
Memory = "{0:N2} GB" -f ((Get-WmiObject Win32_ComputerSystem).TotalPhysicalMemory / 1GB)
CPU = (Get-WmiObject Win32_Processor).Name
}
# 保存系统信息
$SystemInfo | ConvertTo-Json | Out-File "$SnapshotPath\system_info.json"
# 磁盘信息
Get-WmiObject Win32_LogicalDisk | Select-Object DeviceID, @{Name="Size(GB)";Expression={$_.Size/1GB}}, @{Name="FreeSpace(GB)";Expression={$_.FreeSpace/1GB}} |
ConvertTo-Json | Out-File "$SnapshotPath\disk_info.json"
# 服务信息
Get-Service | Select-Object Status, Name, DisplayName |
ConvertTo-Csv -NoTypeInformation | Out-File "$SnapshotPath\services.csv"
# 安装的软件列表
Get-ItemProperty "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*" |
Select-Object DisplayName, DisplayVersion, Publisher |
ConvertTo-Csv -NoTypeInformation | Out-File "$SnapshotPath\installed_software.csv"
# 网络配置
ipconfig /all | Out-File "$SnapshotPath\network_config.txt"
# 路由表
route print | Out-File "$SnapshotPath\routing_table.txt"
# ARP表
arp -a | Out-File "$SnapshotPath\arp_table.txt"
# 计划任务
Get-ScheduledTask | Select-Object TaskName, State, TaskPath |
ConvertTo-Csv -NoTypeInformation | Out-File "$SnapshotPath\scheduled_tasks.csv"
# 事件日志(最近的关键事件)
Get-EventLog -LogName "Application" -EntryType Error -Newest 50 |
Select-Object TimeWritten, Source, EventID, Message |
ConvertTo-Csv -NoTypeInformation | Out-File "$SnapshotPath\application_errors.csv"
Get-EventLog -LogName "System" -EntryType Error -Newest 50 |
Select-Object TimeWritten, Source, EventID, Message |
ConvertTo-Csv -NoTypeInformation | Out-File "$SnapshotPath\system_errors.csv"
Write-Log "系统信息收集完成"
}
# 压缩快照
function Compress-Snapshot {
param([string]$Source, [string]$Destination)
try {
Compress-Archive -Path $Source -DestinationPath $Destination -Force
Write-Log "压缩快照创建成功: $Destination"
return $true
}
catch {
Write-Log "压缩失败: $_"
return $false
}
}
# 清理旧快照
function Cleanup-OldSnapshots {
Write-Log "开始清理 $RetentionDays 天前的旧快照..."
$OldSnapshots = Get-ChildItem -Path $SnapshotDir -Filter "*.zip" |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-$RetentionDays) }
foreach ($Old in $OldSnapshots) {
Remove-Item $Old.FullName -Force
Write-Log "删除旧快照: $($Old.Name)"
}
Write-Log "清理完成,剩余快照数量: $(Get-ChildItem -Path $SnapshotDir -Filter "*.zip").Count"
}
# 主函数
function Main {
Write-Log "系统快照脚本启动"
try {
# 创建系统信息快照
Create-SystemInfoSnapshot
# 压缩快照
$ZipFile = "$SnapshotDir\$SnapshotName.zip"
if (Compress-Snapshot -Source $SnapshotPath -Destination $ZipFile) {
# 删除临时目录
Remove-Item -Path $SnapshotPath -Recurse -Force
# 清理旧快照
Cleanup-OldSnapshots
Write-Log "系统快照创建成功: $ZipFile"
# 显示当前快照列表
Write-Log "当前快照列表:"
Get-ChildItem -Path $SnapshotDir -Filter "*.zip" |
Select-Object Name, @{Name="Size(MB)";Expression={$_.Length/1MB}}, LastWriteTime
}
}
catch {
Write-Log "错误: $_"
}
Write-Log "系统快照脚本执行完成"
}
# 运行主函数
Main
定时任务配置脚本
Linux Crontab 配置
# Linux定时任务配置 # 每天凌晨2点执行系统快照 echo "0 2 * * * /usr/local/bin/system_snapshot.sh" | crontab - # 或者添加到现有crontab(推荐) (crontab -l 2>/dev/null; echo "0 2 * * * /usr/local/bin/system_snapshot.sh") | crontab -
Windows 任务计划程序配置
# Windows定时任务配置 # 创建每天凌晨2点执行的任务 $Action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-File `"C:\Scripts\create-snapshot.ps1`"" $Trigger = New-ScheduledTaskTrigger -Daily -At "02:00" $Settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries Register-ScheduledTask -TaskName "SystemSnapshot" -Action $Action -Trigger $Trigger -Settings $Settings
配置文件示例
创建配置文件 snapshot_config.ini:
[System] # 快照目录 snapshot_dir=/var/backups/system_snapshots # 保留天数 retention_days=7 # 日志文件 log_file=/var/log/snapshot.log # 是否压缩快照 compress=yes # 是否清理旧快照 cleanup_old=yes 选项 backup_system_info=yes backup_packages=yes backup_crontab=yes backup_passwd=yes backup_partition=yes
使用方法
Linux系统:
# 安装到指定位置 sudo cp system_snapshot.sh /usr/local/bin/ sudo chmod +x /usr/local/bin/system_snapshot.sh # 手动执行一次 sudo /usr/local/bin/system_snapshot.sh # 配置定时任务 crontab -e # 添加:0 2 * * * /usr/local/bin/system_snapshot.sh
Windows系统:
# 执行脚本 powershell -ExecutionPolicy Bypass -File "C:\Scripts\create-snapshot.ps1" # 配置定时任务 schtasks /create /tn "SystemSnapshot" /tr "powershell -ExecutionPolicy Bypass -File C:\Scripts\create-snapshot.ps1" /sc daily /st 02:00
高级功能扩展
您可以根据需要添加更多功能:
- 数据库备份:添加MySQL/PostgreSQL备份
- 远程备份:将快照上传到远程服务器或云存储
- 邮件通知:快照完成后发送邮件通知
- 完整性校验:生成MD5校验和
- 监控告警:监控快照空间使用率
这个脚本提供了完整的系统快照功能,您可以根据实际需求进行调整和扩展。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播