#!/bin/bash ####################################### # 用户配置区域 # ####################################### # 远程系统配置 REMOTE_USER="root" # 远程系统用户名 REMOTE_HOST="192.168.1.2" # 远程系统IP或主机名 SSH_PORT="22" # 自定义SSH端口,默认为22 LOCAL_BASE_DIR="/opt/backup/main-server" # 本地基础目录 SSH_KEY="/root/.ssh/id_rsa_ugnas" # SSH私钥路径 # 要保留的备份数量(设置为0表示不删除旧备份) KEEP_COUNT=1 # 定义要下载的远程目录数组 REMOTE_PATHS=( "/opt/1panel/backup/system_snapshot" # "root" ) ####################################### # 脚本主体部分 # ####################################### # 检查rsync是否安装 if ! command -v rsync &> /dev/null; then echo "错误:rsync未安装,请先安装rsync" exit 1 fi # 检查SSH密钥是否存在 if [ ! -f "$SSH_KEY" ]; then echo "错误:SSH密钥 $SSH_KEY 不存在" exit 1 fi # 创建本地基础目录 mkdir -p "$LOCAL_BASE_DIR" # 生成时间戳和目录 TIMESTAMP=$(date +%Y%m%d_%H%M%S) BACKUP_DIR="$LOCAL_BASE_DIR/$TIMESTAMP" LOG_FILE="$BACKUP_DIR/download_$TIMESTAMP.log" # 开始备份任务 echo "开始下载任务: $(date)" | tee -a "$LOG_FILE" echo "将保留最新的 $KEEP_COUNT 个备份" | tee -a "$LOG_FILE" # 创建备份目录 mkdir -p "$BACKUP_DIR" # 下载远程目录 for REMOTE_PATH in "${REMOTE_PATHS[@]}"; do DIR_NAME=$(basename "$REMOTE_PATH") LOCAL_DIR="$BACKUP_DIR/$DIR_NAME" echo "正在下载: $REMOTE_PATH 到 $LOCAL_DIR" | tee -a "$LOG_FILE" mkdir -p "$LOCAL_DIR" rsync -avz --progress --stats --human-readable \ -e "ssh -p $SSH_PORT -i $SSH_KEY -o StrictHostKeyChecking=no" \ "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH/" \ "$LOCAL_DIR" 2>&1 | tee -a "$LOG_FILE" [ $? -eq 0 ] && echo "[成功] 下载完成" || echo "[失败] 下载出错" echo "----------------------------------------" | tee -a "$LOG_FILE" done
echo "所有下载任务完成: $(date)" | tee -a "$LOG_FILE" # 清理旧备份目录(修复版) if [ $KEEP_COUNT -gt 0 ]; then echo "----------------------------------------" | tee -a "$LOG_FILE" echo "正在清理旧备份目录..." | tee -a "$LOG_FILE"
total_dirs=${#backup_dirs[@]} echo "当前备份目录总数: $total_dirs" | tee -a "$LOG_FILE"
if [ $total_dirs -gt $KEEP_COUNT ]; then dirs_to_delete=$((total_dirs - KEEP_COUNT)) echo "需要删除 $dirs_to_delete 个旧备份目录" | tee -a "$LOG_FILE"
# 从数组末尾开始删除(最旧的目录) for ((i=KEEP_COUNT; i<total_dirs; i++)); do old_dir="${backup_dirs[$i]}" echo "正在删除: $old_dir" | tee -a "$LOG_FILE" rm -rf "$old_dir" [ $? -eq 0 ] && echo "删除成功" || echo "删除失败" done else echo "无需清理,当前目录数未超过保留数量" | tee -a "$LOG_FILE" fi fi
echo "----------------------------------------" | tee -a "$LOG_FILE" echo "所有操作完成!" | tee -a "$LOG_FILE"