一.在远程接收服务器安装 rsync

SSH 登录到 远程服务器 IP,根据系统执行对应命令:

如果是 CentOS / RHEL / AlmaLinux(宝塔默认常用)

yum install rsync -y

如果是 Debian / Ubuntu

apt update && apt install rsync -y

验证安装

rsync --version

能输出版本信息就说明装好了。

宝塔面板-》安全-》ssh管理  勾选SSH密钥登录 保存既可以;

二.在宝塔本机上创建 /www/sync_remote.sh:

    #!/bin/bash

    # ========== 配置区域 ==========
    SOURCE="/www/source_dir/"                # 本地源目录,结尾带 /
    REMOTE_USER="root"                       # 远程服务器用户名
    REMOTE_HOST="192.168.1.100"              # 远程服务器 IP 或域名
    REMOTE_PORT="22"                         # SSH 端口,默认 22
    REMOTE_PATH="/www/remote_target_dir/"    # 远程目标目录,结尾带 /
    LOGFILE="/var/log/sync_remote.log"
    LOCKFILE="/var/run/sync_remote.lock"
    
    # ---- 每天清空一次日志 ----
    TODAY=$(date +%Y%m%d)
    LAST_CLEAN_FILE="/var/run/sync_remote.clean_date"
    
    if [ -f "$LAST_CLEAN_FILE" ]; then
        LAST_CDATE=$(cat "$LAST_CLEAN_FILE")
    else
        LAST_CDATE="none"
    fi
    
    if [ "$TODAY" != "$LAST_CDATE" ]; then
        : > "$LOGFILE"                       # 清空日志文件
        echo "$TODAY" > "$LAST_CLEAN_FILE"
    fi
    # -------------------------
    
    exec 200>"$LOCKFILE"
    
    # ---------- 排除列表(可根据需要增减)----------
    # 目录:相对于 SOURCE 的路径,如 "runtime" 会排除 /www/source_dir/runtime 及所有子内容
    # 文件:也支持通配符,如 "*.log" 或 "cache/*.tmp"
    EXCLUDES=(
        "runtime"
        ".well-known"
        ".git"
        "node_modules"
        "*.log"
        ".htaccess"
        ".user.ini"
        "robots.txt"
    )
    # =============================
    
    exec 200>"$LOCKFILE"
    flock -n 200 || {
        echo "$(date '+%F %T') - 上一次同步尚未完成,跳过本次执行。" >> "$LOGFILE"
        exit 1
    }
    
    echo "$(date '+%F %T') - 开始向远程服务器同步..." >> "$LOGFILE"
    
    # 构建 rsync 的排除参数
    EXCLUDE_ARGS=()
    for item in "${EXCLUDES[@]}"; do
        EXCLUDE_ARGS+=(--exclude="$item")
    done
    
    # 远程同步:-a 归档保留属性,-v 详细输出,-z 压缩传输,--update 仅同步新增和修改过的文件
    rsync -avz --update \
        "${EXCLUDE_ARGS[@]}" \
        -e "ssh -p $REMOTE_PORT" \
        "$SOURCE" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH" >> "$LOGFILE" 2>&1
    
    EXIT_CODE=$?
    if [ $EXIT_CODE -eq 0 ]; then
        echo "$(date '+%F %T') - 同步成功" >> "$LOGFILE"
    else
        echo "$(date '+%F %T') - 同步出错,返回码 $EXIT_CODE" >> "$LOGFILE"
    fi
    
    exit $EXIT_CODE

三.必须做的:配置 SSH 免密登录

计划任务是后台运行,无法交互输入密码,必须提前配好密钥。

1. 在宝塔本机上生成密钥(如果还没有)

    打开宝塔终端,或以 root 身份登录 SSH,执行:

ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""

一路回车即可,会在 /root/.ssh/ 下生成 id_rsa(私钥)和 id_rsa.pub(公钥)。

2. 把公钥拷贝到远程服务器

    执行以下命令,按提示输入远程服务器的 root 密码一次即可:

ssh-copy-id -p 22 root@103.145.190.82

    

    如果 SSH 端口不是 22,记得改成实际端口。

    如选22记得安全 系统防火墙的22端口已开放

    

    3. 测试免密是否成功

ssh -p 22 root@103.145.190.82 "echo ok"

    

    能直接输出 ok 就说明配置完成。

    

    

    在宝塔面板添加计划任务

    和之前一样:

    

    1.进入 计划任务 → Shell 脚本。

    

    2.执行周期:每分钟。

    

    3.脚本内容:

bash /www/sync_remote.sh

    

    4.提交。

四.验证与注意事项

先手动跑一次:bash /www/sync_remote.sh,再查看日志 cat /var/log/sync_remote.log,确认没有权限错误或连接超时。

    

    方向:脚本是从本机推送到远程。如果需要远程拉取,只需把 SOURCE 和 TARGET 的 rsync 参数对调。

    

    防火墙/安全组:确保远程服务器允许来自本机的 SSH 端口连接。

    

    远程目录权限:远程用户必须对目标路径有写入权限。

    

    大量小文件:每分钟同步可能导致部分文件传输耗时超过 1 分钟,但由于有文件锁,不会堆积任务,最长只等当前任务跑完再启动下一次。必要时可改成每 2 分钟执行。

    

    按这个方案,宝塔就能每分钟自动把本机变化过的文件推送到另一台服务器了。如果有其他特殊需求(比如排除目录、限速等),可以再在 rsync 命令里加参数。