如何编写自动备份并加密上传

wen 实用脚本 3

本文目录导读:

如何编写自动备份并加密上传

  1. 基本架构
  2. 完整脚本方案(Linux/Mac)
  3. Windows 方案(PowerShell)
  4. 使用专门的备份工具
  5. 安全建议
  6. 解密验证
  7. 推荐的备份策略

我来介绍一种自动备份并加密上传的完整方案,使用开源工具实现。

基本架构

源文件 → 压缩 → 加密 → 上传到云存储

完整脚本方案(Linux/Mac)

基础备份脚本

#!/bin/bash
# ===== 配置参数 =====
BACKUP_NAME="my_project"
BACKUP_SRC="/path/to/source"
BACKUP_TEMP="/tmp/backups"
ENCRYPT_KEY="your-encryption-key"
UPLOAD_TARGET="s3://my-bucket/backups/"
RETENTION_DAYS=30
# ===== 时间戳 =====
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="${BACKUP_NAME}_${TIMESTAMP}.tar.gz"
ENCRYPTED_FILE="${BACKUP_FILE}.gpg"
# ===== 1. 创建临时目录 =====
mkdir -p "$BACKUP_TEMP"
# ===== 2. 压缩备份 =====
echo "📦 正在压缩备份..."
tar -czf "${BACKUP_TEMP}/${BACKUP_FILE}" -C "$(dirname "$BACKUP_SRC")" "$(basename "$BACKUP_SRC")"
# ===== 3. 加密 =====
echo "🔒 正在加密..."
gpg --batch --yes --passphrase "$ENCRYPT_KEY" \
    --symmetric --cipher-algo AES256 \
    -o "${BACKUP_TEMP}/${ENCRYPTED_FILE}" \
    "${BACKUP_TEMP}/${BACKUP_FILE}"
# ===== 4. 上传到云存储 =====
echo "☁️ 正在上传..."
# AWS S3
aws s3 cp "${BACKUP_TEMP}/${ENCRYPTED_FILE}" "${UPLOAD_TARGET}"
# 或者使用其他云存储服务
# rclone copy "${BACKUP_TEMP}/${ENCRYPTED_FILE}" "google-drive:backups/"
# ===== 5. 清理临时文件 =====
rm -f "${BACKUP_TEMP}/${BACKUP_FILE}"
rm -f "${BACKUP_TEMP}/${ENCRYPTED_FILE}"
# ===== 6. 清理旧备份(可选) =====
echo "🧹 清理旧备份..."
aws s3 ls "${UPLOAD_TARGET}" | while read -r line; do
    create_date=$(echo $line | awk '{print $1}')
    if [[ $(date -d "$create_date" +%s) -lt $(date -d "-${RETENTION_DAYS} days" +%s) ]]; then
        file_name=$(echo $line | awk '{print $4}')
        aws s3 rm "${UPLOAD_TARGET}${file_name}"
    fi
done
echo "✅ 备份完成: ${ENCRYPTED_FILE}"

使用 GPG 密钥对加密(更安全)

#!/bin/bash
# ===== 配置 =====
BACKUP_NAME="server_backup"
BACKUP_SRC="/var/www"
BACKUP_TEMP="/tmp/backups"
RECIPIENT_EMAIL="your-email@example.com"
UPLOAD_TARGET="s3://my-bucket/backups/"
# ===== 生成密钥对(首次) =====
# gpg --full-generate-key
# ===== 导出公钥用于加密 =====
# gpg --export --armor "$RECIPIENT_EMAIL" > public-key.asc
# ===== 备份脚本 =====
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="${BACKUP_NAME}_${TIMESTAMP}.tar.gz"
ENCRYPTED_FILE="${BACKUP_FILE}.gpg"
mkdir -p "$BACKUP_TEMP"
# 压缩
tar -czf "${BACKUP_TEMP}/${BACKUP_FILE}" \
    --exclude="node_modules" \
    --exclude=".git" \
    -C "$(dirname "$BACKUP_SRC")" "$(basename "$BACKUP_SRC")"
# 使用公钥加密(无需密码)
gpg --batch --yes --trust-model always \
    --encrypt --recipient "$RECIPIENT_EMAIL" \
    -o "${BACKUP_TEMP}/${ENCRYPTED_FILE}" \
    "${BACKUP_TEMP}/${BACKUP_FILE}"
# 上传
rclone copy "${BACKUP_TEMP}/${ENCRYPTED_FILE}" \
    "my-encrypted-backup:backups/"
# 清理
rm -f "${BACKUP_TEMP}/${BACKUP_FILE}"
rm -f "${BACKUP_TEMP}/${ENCRYPTED_FILE}"
echo "✅ 备份完成"

设置定时任务(Crontab)

# 编辑 crontab
crontab -e
# 每天凌晨2点执行
0 2 * * * /path/to/backup-script.sh >> /var/log/backup.log 2>&1
# 每6小时执行一次
0 */6 * * * /path/to/backup-script.sh
# 每周日凌晨3点执行
0 3 * * 0 /path/to/backup-script.sh

Windows 方案(PowerShell)

使用 7-Zip 和 Gpg4win

# backup.ps1
# ===== 配置 =====
$BackupName = "Windows_Backup"
$SourcePath = "C:\Important"
$BackupTemp = "C:\Temp\Backups"
$EncryptPass = "your-strong-password"
$UploadTarget = "s3://my-bucket/backups/"
# ===== 时间戳 =====
$Timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
$BackupFile = "$BackupName`_$Timestamp.7z"
$EncryptedFile = "$BackupFile.gpg"
# ===== 创建临时目录 =====
New-Item -ItemType Directory -Force -Path $BackupTemp
# ===== 压缩 =====
Write-Host "压缩中..."
& "C:\Program Files\7-Zip\7z.exe" a "$BackupTemp\$BackupFile" $SourcePath
# ===== 加密 =====
Write-Host "加密中..."
& "C:\Program Files (x86)\GnuPG\bin\gpg.exe" `
    --batch --passphrase $EncryptPass `
    --symmetric --cipher-algo AES256 `
    -o "$BackupTemp\$EncryptedFile" `
    "$BackupTemp\$BackupFile"
# ===== 上传 =====
Write-Host "上传中..."
aws s3 cp "$BackupTemp\$EncryptedFile" $UploadTarget
# ===== 清理 =====
Remove-Item "$BackupTemp\$BackupFile"
Remove-Item "$BackupTemp\$EncryptedFile"
Write-Host "备份完成"

使用专门的备份工具

Duplicati(推荐)

# 安装 Duplicati
# 使用 Docker
docker run -d \
    --name duplicati \
    -p 8200:8200 \
    -v /source:/source:ro \
    -v /backups:/backups \
    linuxserver/duplicati
# Web 界面配置: http://localhost:8200

Restic(命令行)

#!/bin/bash
# restic 备份脚本
REPO="s3:https://s3.amazonaws.com/my-bucket/restic-repo"
PASSWORD="your-repo-password"
# 初始化仓库(仅首次)
restic -r "$REPO" init
# 备份
restic -r "$REPO" \
    --password-file <(echo "$PASSWORD") \
    backup /path/to/important \
    --exclude="*.tmp" \
    --exclude="node_modules"
# 自动加密,支持增量备份
# 恢复命令
# restic -r "$REPO" restore latest --target /restore

安全建议

密钥管理

# 使用密钥管理服务
# AWS KMS
aws kms encrypt --key-id alias/my-key \
    --plaintext fileb://backup.tar.gz \
    --output text --query CiphertextBlob | base64 --decode > backup.tar.gz.encrypted
# 或使用 HashiCorp Vault
vault write -field=ciphertext transit/encrypt/my-key \
    plaintext=$(base64 < backup.tar.gz) > backup.tar.gz.encrypted

完整示例:集成通知

#!/bin/bash
# ===== 完整备份脚本 =====
CONFIG_FILE="/etc/backup/config.sh"
source "$CONFIG_FILE"
backup() {
    log_file="/var/log/backup_$(date +%Y%m%d).log"
    {
        echo "=== 开始备份: $(date) ==="
        # 1. 数据库备份
        mysqldump -u root --all-databases > /tmp/db.sql
        # 2. 文件备份
        tar -czf /tmp/files.tar.gz /etc /var/www
        # 3. 合并并加密
        tar -czf - /tmp/db.sql /tmp/files.tar.gz | \
            gpg --encrypt --recipient admin@example.com \
            > "/backups/full_$(date +%Y%m%d).tar.gz.gpg"
        # 4. 上传
        s3cmd put "/backups/full_$(date +%Y%m%d).tar.gz.gpg" s3://backups/
        # 5. 清理
        rm -f /tmp/db.sql /tmp/files.tar.gz
        echo "=== 备份完成: $(date) ==="
    } 2>&1 | tee -a "$log_file"
    # 发送通知
    if [ $? -eq 0 ]; then
        curl -X POST -H "Content-Type: application/json" \
            -d '{"text":"备份成功"}' \
            https://hooks.slack.com/services/YOUR/WEBHOOK
    fi
}
# 执行
backup

解密验证

# 解密备份文件
gpg --decrypt backup.tar.gz.gpg > backup.tar.gz
tar -tzf backup.tar.gz
# 使用密钥对加密时
gpg --decrypt --recipient your-email@example.com backup.tar.gz.gpg > backup.tar.gz

推荐的备份策略

  1. 3-2-1 规则:3份备份,2种介质,1份异地
  2. 定期测试:每月恢复测试
  3. 增量+全量:每周全量,每日增量
  4. 加密存储:传输和存储都加密

选择最适合你需求的方案,建议先在小规模数据上测试验证。

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