一.在远程接收服务器安装 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 命令里加参数。