自动备份脚本#
脚本说明#
自动备份脚本用于定期备份重要目录和文件,支持增量备份、压缩、加密等功能。
脚本代码#
#!/bin/bash
# 自动备份脚本
# 功能:自动备份指定目录到指定位置
# 作者:System Admin
# 日期:2026-01-01
set -euo pipefail
# 配置变量
BACKUP_DIR="/backup"
SOURCE_DIRS=("/etc" "/home" "/var/www" "/root")
RETENTION_DAYS=30
LOG_FILE="/var/log/backup.log"
ENCRYPT=false
ENCRYPT_KEY=""
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m'
# 日志函数
log() {
local level=$1
shift
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$timestamp] [$level] $@" | tee -a "$LOG_FILE"
}
log_info() {
log "INFO" "$@"
}
log_error() {
log "ERROR" "$@"
}
log_warning() {
log "WARNING" "$@"
}
# 检查备份目录
check_backup_dir() {
if [ ! -d "$BACKUP_DIR" ]; then
log_info "创建备份目录: $BACKUP_DIR"
mkdir -p "$BACKUP_DIR"
fi
if [ ! -w "$BACKUP_DIR" ]; then
log_error "备份目录不可写: $BACKUP_DIR"
exit 1
fi
}
# 执行备份
do_backup() {
local source=$1
local date=$(date +%Y-%m-%d)
local backup_file="$BACKUP_DIR/$(basename $source)-$date.tar.gz"
local temp_file="$backup_file.tmp"
log_info "开始备份: $source -> $backup_file"
# 检查源目录
if [ ! -e "$source" ]; then
log_warning "源目录不存在: $source"
return 1
fi
# 执行备份
if tar -czf "$temp_file" "$source" 2>> "$LOG_FILE"; then
# 加密备份文件
if [ "$ENCRYPT" = true ] && [ -n "$ENCRYPT_KEY" ]; then
log_info "加密备份文件"
if openssl enc -aes-256-cbc -salt -in "$temp_file" -out "$backup_file.enc" -k "$ENCRYPT_KEY" 2>> "$LOG_FILE"; then
rm -f "$temp_file"
backup_file="$backup_file.enc"
else
log_error "加密失败"
rm -f "$temp_file"
return 1
fi
else
mv "$temp_file" "$backup_file"
fi
# 计算文件大小
local size=$(du -h "$backup_file" | cut -f1)
log_info "备份完成: $backup_file (大小: $size)"
return 0
else
log_error "备份失败: $source"
rm -f "$temp_file"
return 1
fi
}
# 清理旧备份
cleanup_old_backups() {
log_info "清理 $RETENTION_DAYS 天前的旧备份"
find "$BACKUP_DIR" -name "*.tar.gz*" -mtime +$RETENTION_DAYS -exec rm -f {} \;
local count=$(find "$BACKUP_DIR" -name "*.tar.gz*" | wc -l)
log_info "当前备份文件数量: $count"
}
# 生成备份报告
generate_report() {
local date=$(date +%Y-%m-%d)
local report_file="$BACKUP_DIR/backup-report-$date.txt"
log_info "生成备份报告: $report_file"
{
echo "备份报告"
echo "生成时间: $(date)"
echo "备份目录: $BACKUP_DIR"
echo ""
echo "备份文件列表:"
ls -lh "$BACKUP_DIR"/*.tar.gz* 2>/dev/null || echo "无备份文件"
echo ""
echo "磁盘使用情况:"
df -h "$BACKUP_DIR"
} > "$report_file"
}
# 主函数
main() {
log_info "===== 开始自动备份 ====="
# 检查备份目录
check_backup_dir
# 执行备份
local success_count=0
local fail_count=0
for source in "${SOURCE_DIRS[@]}"; do
if do_backup "$source"; then
success_count=$((success_count + 1))
else
fail_count=$((fail_count + 1))
fi
done
# 清理旧备份
cleanup_old_backups
# 生成报告
generate_report
# 输出结果
log_info "===== 备份完成 ====="
log_info "成功: $success_count, 失败: $fail_count"
if [ $fail_count -eq 0 ]; then
return 0
else
return 1
fi
}
# 执行主函数
main "$@"使用说明#
修改配置变量:
BACKUP_DIR: 备份目录SOURCE_DIRS: 需要备份的目录列表RETENTION_DAYS: 保留天数LOG_FILE: 日志文件路径
添加执行权限:
chmod +x auto_backup.sh执行脚本:
./auto_backup.sh设置定时任务(每天凌晨2点执行):
0 2 * * * /path/to/auto_backup.sh
功能特点#
- 支持多目录备份
- 自动压缩备份文件
- 可选加密功能
- 自动清理旧备份
- 详细的日志记录
- 备份报告生成
- 错误处理机制
依赖项#
- tar: 用于文件打包和压缩
- openssl: 用于文件加密(可选)
- find: 用于查找和清理旧文件
注意事项#
- 确保备份目录有足够的磁盘空间
- 定期检查备份文件的完整性
- 测试恢复流程确保备份可用
- 建议将备份文件同步到远程服务器
- 加密密钥需要安全保存