文件自动备份与同步脚本

代码脚本 · 备份同步

使用rsync自动备份目录到远程服务器或本地,支持增量备份、日志记录、邮件通知

详细内容

#!/bin/bash # ========================================== # 文件自动备份与同步脚本 # 用途:使用rsync增量备份目录到远程服务器 # 使用方法: # 1. 修改配置项 # 2. bash file_backup.sh # 3. 可加入crontab定时执行 # ========================================== # ========== 配置项 ========== SOURCE_DIR="/data/www" # 要备份的源目录 DEST_USER="backup" # 远程服务器用户名 DEST_HOST="192.168.1.100" # 远程服务器地址 DEST_PORT="22" # SSH端口 DEST_DIR="/backup/www" # 远程备份目录 # 本地备份模式(设为true则备份到本地目录而非远程) LOCAL_MODE=false LOCAL_DEST="/backup/local" # 保留策略 RETENTION_DAYS=30 # 本地备份保留天数 # 排除规则(空格分隔) EXCLUDE="--exclude=*.log --exclude=*.tmp --exclude=node_modules --exclude=.git" # 邮件通知 EMAIL_NOTIFY=false EMAIL_TO="admin@example.com" # ============================ DATE=$(date '+%Y%m%d_%H%M%S') LOG_FILE="/tmp/backup_${DATE}.log" echo "========== 文件备份开始 ==========" | tee "$LOG_FILE" echo "开始时间: $(date '+%Y-%m-%d %H:%M:%S')" | tee -a "$LOG_FILE" echo "源目录: $SOURCE_DIR" | tee -a "$LOG_FILE" if [ "$LOCAL_MODE" = true ]; then echo "目标: 本地 $LOCAL_DEST" | tee -a "$LOG_FILE" mkdir -p "$LOCAL_DEST" RSYNC_CMD="rsync -avz --delete $EXCLUDE $SOURCE_DIR/ $LOCAL_DEST/" else echo "目标: 远程 $DEST_USER@$DEST_HOST:$DEST_DIR" | tee -a "$LOG_FILE" RSYNC_CMD="rsync -avz --delete -e 'ssh -p $DEST_PORT' $EXCLUDE $SOURCE_DIR/ $DEST_USER@$DEST_HOST:$DEST_DIR/" fi echo "" | tee -a "$LOG_FILE" echo "执行命令: $RSYNC_CMD" | tee -a "$LOG_FILE" echo "" | tee -a "$LOG_FILE" # 执行备份 START_TIME=$(date +%s) eval "$RSYNC_CMD" >> "$LOG_FILE" 2>&1 EXIT_CODE=$? END_TIME=$(date +%s) DURATION=$((END_TIME - START_TIME)) echo "" | tee -a "$LOG_FILE" if [ $EXIT_CODE -eq 0 ]; then echo "✓ 备份成功!耗时: ${DURATION}秒" | tee -a "$LOG_FILE" STATUS="成功" else echo "✗ 备份失败!退出码: $EXIT_CODE,耗时: ${DURATION}秒" | tee -a "$LOG_FILE" STATUS="失败" fi # 本地模式下清理旧备份 if [ "$LOCAL_MODE" = true ]; then echo "" | tee -a "$LOG_FILE" echo "清理${RETENTION_DAYS}天前的旧备份..." | tee -a "$LOG_FILE" find "$LOCAL_DEST" -type f -mtime +$RETENTION_DAYS -delete 2>/dev/null fi # 备份统计 echo "" | tee -a "$LOG_FILE" echo "【备份统计】" | tee -a "$LOG_FILE" if [ "$LOCAL_MODE" = true ]; then du -sh "$LOCAL_DEST" | awk '{print " 备份大小: "$1}' | tee -a "$LOG_FILE" find "$LOCAL_DEST" -type f | wc -l | awk '{print " 文件数量: "$1}' | tee -a "$LOG_FILE" else ssh -p "$DEST_PORT" "$DEST_USER@$DEST_HOST" "du -sh $DEST_DIR && find $DEST_DIR -type f | wc -l" 2>/dev/null | tee -a "$LOG_FILE" fi echo "" | tee -a "$LOG_FILE" echo "结束时间: $(date '+%Y-%m-%d %H:%M:%S')" | tee -a "$LOG_FILE" echo "========== 文件备份结束 ==========" | tee -a "$LOG_FILE" # 邮件通知 if [ "$EMAIL_NOTIFY" = true ]; then SUBJECT="【文件备份${STATUS}】$(date '+%Y-%m-%d %H:%M')" BODY=$(cat "$LOG_FILE") echo "$BODY" | mail -s "$SUBJECT" "$EMAIL_TO" fi exit $EXIT_CODE

适配环境

适配系统:CentOS 7+,Ubuntu 18.04+,Debian 10+

依赖环境:bash 4.0+

参数说明

[{"name": "SOURCE_DIR", "label": "\u6e90\u76ee\u5f55", "default": "/data/www"}, {"name": "DEST_HOST", "label": "\u8fdc\u7a0b\u670d\u52a1\u5668\u5730\u5740", "default": "192.168.1.100"}, {"name": "DEST_USER", "label": "\u8fdc\u7a0b\u7528\u6237\u540d", "default": "backup"}, {"name": "DEST_DIR", "label": "\u8fdc\u7a0b\u5907\u4efd\u76ee\u5f55", "default": "/backup/www"}]
备份同步rsync

更多备份同步