自动备份脚本#

脚本说明#

自动备份脚本用于定期备份重要目录和文件,支持增量备份、压缩、加密等功能。

脚本代码#

#!/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 "$@"

使用说明#

  1. 修改配置变量:

    • BACKUP_DIR: 备份目录
    • SOURCE_DIRS: 需要备份的目录列表
    • RETENTION_DAYS: 保留天数
    • LOG_FILE: 日志文件路径
  2. 添加执行权限:

    chmod +x auto_backup.sh
  3. 执行脚本:

    ./auto_backup.sh
  4. 设置定时任务(每天凌晨2点执行):

    0 2 * * * /path/to/auto_backup.sh

功能特点#

  • 支持多目录备份
  • 自动压缩备份文件
  • 可选加密功能
  • 自动清理旧备份
  • 详细的日志记录
  • 备份报告生成
  • 错误处理机制

依赖项#

  • tar: 用于文件打包和压缩
  • openssl: 用于文件加密(可选)
  • find: 用于查找和清理旧文件

注意事项#

  1. 确保备份目录有足够的磁盘空间
  2. 定期检查备份文件的完整性
  3. 测试恢复流程确保备份可用
  4. 建议将备份文件同步到远程服务器
  5. 加密密钥需要安全保存