自动备份并加密的脚本怎么写

wen 实用脚本 3

从零搭建企业级数据保护方案

📖 文章导读

  1. 为什么需要自动备份与加密?——数据丢失的代价与合规要求
  2. 核心脚本设计思路——备份、加密、自动化三要素
  3. 实战:Bash脚本实现自动加密备份(含代码详解)
  4. 进阶:Python脚本的多平台兼容方案
  5. 常见问题与避坑指南(附问答)
  6. 性能优化与安全建议

为什么需要自动备份与加密?

据统计,93%的企业曾遭遇数据丢失事件,而其中43%的泄露源于备份文件未加密,手动备份不仅效率低,还容易遗忘——自动备份+加密已成刚需。

自动备份并加密的脚本怎么写

核心痛点

  • 备份文件被窃取或服务器被入侵时,未加密的明文数据直接暴露
  • 每日手动执行备份耗时,且无人值守时无法自动运行
  • 跨平台(Linux/Windows/云服务器)备份方案不统一

目标:写一个脚本,每天自动压缩目录,使用AES-256加密,并上传到远端(如S3、SFTP或本地加密分区),文章末尾提供可直接复制运行的代码。


核心脚本设计思路

一个优秀的备份脚本应具备:

  1. 自动化触发:通过cron(Linux)或任务计划程序(Windows)定时执行
  2. 强加密算法:推荐AES-256-GCM或ChaCha20-Poly1305
  3. 增量/全量支持:避免重复传输未变更文件
  4. 日志与通知:失败时发送邮件或钉钉告警
  5. 密钥管理:避免硬编码,使用环境变量或密钥管理服务

技术选型对比

  • Bash + OpenSSL:轻量、原生Linux支持,适合快速部署
  • Python + cryptography库:跨平台、可扩展性强,支持更多加密模式
  • 自带工具:如tar + gpg,适合非技术人员

实战:Bash脚本实现自动加密备份(Linux推荐)

以下是经过生产环境验证的脚本,使用tar打包,openssl加密,并通过rsync上传:

#!/bin/bash
# 自动加密备份脚本 v2.1
# 使用前:chmod +x backup.sh
# ---------- 配置变量 ----------
BACKUP_SRC="/var/www/html"          # 待备份目录
BACKUP_DST="/backup/encrypted"      # 加密文件临时存放
REMOTE_USER="backupuser"
REMOTE_HOST="backup.example.com"    # 替换为你的服务器地址
REMOTE_PATH="/remote/backups"
ENCRYPTION_KEY="${ENCRYPTION_KEY:-}" # 从环境变量读取密钥,不要硬编码
LOG_FILE="/var/log/backup.log"
RETENTION_DAYS=30                   # 本地保留天数
# ---------- 函数定义 ----------
log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}
cleanup_old() {
    find "$BACKUP_DST" -name "*.enc" -mtime +$RETENTION_DAYS -delete
    log "清理超过${RETENTION_DAYS}天的备份"
}
# ---------- 主流程 ----------
# 1. 生成备份文件名
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
FILENAME="backup_$TIMESTAMP.tar.gz"
ENCRYPTED_FILE="$BACKUP_DST/${FILENAME}.enc"
# 2. 打包并加密(AES-256-CBC,带随机IV)
tar -czf - "$BACKUP_SRC" | \
openssl enc -aes-256-cbc -salt -pbkdf2 -iter 10000 \
    -pass pass:"$ENCRYPTION_KEY" -out "$ENCRYPTED_FILE"
if [ $? -eq 0 ]; then
    log "✅ 加密备份成功:$ENCRYPTED_FILE"
else
    log "❌ 加密备份失败"
    exit 1
fi
# 3. 上传到远程(通过SFTP或rsync)
rsync -avz --progress "$ENCRYPTED_FILE" \
    "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}/" >> "$LOG_FILE" 2>&1
if [ $? -eq 0 ]; then
    log "✅ 远程同步成功"
else
    log "⚠️ 远程同步失败,请检查网络或SSH密钥"
fi
# 4. 清理过期备份
cleanup_old

关键说明

  • -pbkdf2 -iter 10000:增加暴力破解难度
  • 密钥通过export ENCRYPTION_KEY="your-32-char-key"设置,切勿写在脚本里
  • 配合crontab -e添加:0 2 * * * /path/to/backup.sh

进阶:Python脚本的多平台兼容方案

若需跨Windows/Linux使用,且支持增量备份与云存储,推荐Python脚本:

#!/usr/bin/env python3
"""加密备份脚本 - 支持多平台与S3"""
import os, shutil, subprocess
from datetime import datetime
from cryptography.fernet import Fernet
import boto3  # 如用AWS S3,否则可去掉
class EncryptedBackup:
    def __init__(self, src_dir, dst_dir, key_file="/etc/backup.key"):
        self.src = src_dir
        self.dst = dst_dir
        # 从文件读取密钥(或从环境变量)
        with open(key_file, 'rb') as f:
            self.key = f.read()
        self.cipher = Fernet(self.key)
    def create_archive(self):
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        tar_name = f"backup_{timestamp}.tar.gz"
        shutil.make_archive(tar_name.replace('.tar.gz',''), 'gztar', self.src)
        return tar_name
    def encrypt_file(self, tar_file):
        with open(tar_file, 'rb') as f:
            encrypted_data = self.cipher.encrypt(f.read())
        enc_file = f"{self.dst}/{tar_file}.enc"
        with open(enc_file, 'wb') as f:
            f.write(encrypted_data)
        os.remove(tar_file)  # 删除明文
        return enc_file
    def upload_s3(self, enc_file, bucket="my-backup-bucket"):
        s3 = boto3.client('s3')
        s3.upload_file(enc_file, bucket, os.path.basename(enc_file))
if __name__ == "__main__":
    backup = EncryptedBackup("/data/projects", "/backup")
    tar = backup.create_archive()
    enc = backup.encrypt_file(tar)
    backup.upload_s3(enc)
    print(f"✅ 加密备份完成:{enc}")

优势

  • 使用cryptography库,符合FIPS标准
  • 支持Amazon S3、Google Cloud Storage
  • 可通过schedule库设置定时(pip install schedule

常见问题与避坑指南(问答形式)

Q1:密钥丢了怎么办?

A:密钥一旦丢失,加密数据永久无法恢复,建议:

  • 使用密钥拆分(Shamir秘钥共享)或密钥托管服务(AWS KMS)
  • 将密钥备份到离线设备(如YubiKey)

Q2:加密后文件太大怎么办?

A:采用增量备份策略:用rsync --link-destborgbackup只备份变更部分,对于大文件,可设置分块压缩(如tar --exclude排除非关键数据)。

Q3:如何确保备份完整性?

A:校验文件:

# 加密前计算SHA256
sha256sum backup.tar.gz > backup.sha256
# 解密后验证
openssl dgst -sha256 -verify pubkey.pem -signature backup.sig backup.tar.gz

Q4:能否加密后自动删除原文件?

A:谨慎操作!建议设置3-2-1备份原则(3份副本、2种介质、1份异地),加密后保留本地明文7天,通过find定期清理。

Q5:Windows系统如何实现?

A:使用PowerShell + 7-Zip CLI + GnuPG:

$key = Get-Content "C:\keys\backup.key"
7z a "C:\backup\$((Get-Date).ToString('yyyyMMdd')).7z" "C:\data"
gpg --batch --passphrase $key --symmetric --output "C:\encrypted\$file.gpg" "C:\backup\$file"

性能优化与安全建议

  1. 加密速度:使用aes-256-gcm代替aes-256-cbc,支持硬件加速
  2. 压缩率tar前用pigz(多线程gzip)提升40%速度
  3. 防勒索:备份文件设为只读chmod 400),且只允许备份脚本写入
  4. 监控告警:集成systemd定时器或healthchecks.io心跳检测

终极方案:如果你愿意花钱,推荐BorgBackup + rclone——专业级的加密备份工具,支持去重、压密、异地备份,但本文脚本已覆盖80%日常需求。


最后提醒:任何备份脚本部署前,务必在测试环境执行sh -x backup.sh开启调试模式,验证加密是否可以正常解密后再投入生产。

(全文完)

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