Rsync + Crontab 异地自动备份的核心是配置免密SSH、正确路径权限、脚本封装及cron环境适配;需生成密钥、复制公钥、验证登录,编写含日志、排除项和错误处理的备份脚本,并在crontab中显式声明PATH与SHELL以确保可靠执行。

用 Rsync + Crontab 实现异地自动备份,核心是:一次配置好同步逻辑,再让系统定时触发。关键不在命令多复杂,而在路径、权限、SSH 免密和 crontab 环境这四点不出错。
确保 Rsync 能无密码推送到远程服务器
自动备份的前提是免交互登录。不能每次备份都输密码,否则 cron 会卡住。
- 在本地服务器生成 SSH 密钥(如尚未生成):ssh-keygen -t ed25519
- 将公钥复制到目标服务器:ssh-copy-id user@backup-server-ip
- 手动测试是否免密成功:ssh user@backup-server-ip ls /home —— 能直接返回结果即通过
- 若目标服务器禁用了密码登录,请确认 sshd_config 中 PubkeyAuthentication yes 已启用
写一个安全可靠的 Rsync 备份脚本
不建议把 rsync 命令直接写进 crontab,应封装成可读、可查、可记录的 shell 脚本。
- 新建脚本,例如:/home/user/bin/backup-to-remote.sh
- 内容示例(按需替换路径与排除项):
#!/bin/bash SOURCE="/var/www/html/" DEST="user@backup-server-ip:/backup/www/" LOG="/var/log/backup.log" DATE=$(date '+%Y-%m-%d %H:%M:%S') <p>echo "[$DATE] 开始同步 $SOURCE → $DEST" >> $LOG</p><p>rsync -avz \ --delete \ --exclude='cache/' \ --exclude='logs/' \ -e "ssh -o StrictHostKeyChecking=no" \ "$SOURCE" "$DEST" >> $LOG 2>&1</p><p>if [ $? -eq 0 ]; then echo "[$DATE] 同步完成" >> $LOG else echo "[$DATE] 同步失败!" >> $LOG fi
- 给脚本加执行权限:chmod +x /home/user/bin/backup-to-remote.sh
- 先手动运行一次:/home/user/bin/backup-to-remote.sh,检查日志和远程目录是否更新
用 Crontab 设置定时任务
cron 默认使用简化的 shell 环境,PATH 往往不包含 /usr/local/bin 或 /home/user/bin,容易导致找不到 rsync 或 ssh。
- 编辑用户级定时任务:crontab -e
- 添加一行(例如每天凌晨 2:30 执行):
30 2 * * * /bin/bash /home/user/bin/backup-to-remote.sh
- 更稳妥的做法:在 crontab 开头显式声明 PATH 和 SHELL:
SHELL=/bin/bash PATH=/usr/local/bin:/usr/bin:/bin 30 2 * * * /home/user/bin/backup-to-remote.sh
- 保存后可用 crontab -l 确认;日志中会持续记录每次执行时间与结果
验证与日常维护要点
自动≠可靠。要定期确认备份是否真正在运行、数据是否完整、空间是否充足。
- 检查 cron 是否生效:grep CRON /var/log/syslog(Ubuntu/Debian)或 journalctl -u cron | tail -20(systemd 系统)
- 远程登录备份服务器,用 ls -lt /backup/www/ 查看最新文件修改时间是否匹配计划时间
- 在脚本里加入磁盘空间检测(可选),避免备份因空间不足静默失败
- 为防止误删,远程目录建议启用 --delete-after 而非 --delete,或配合 --dry-run 先测试

















