文件自动备份与同步脚本
使用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"}]