核心是确保crontab执行rsync或scp时免密SSH认证;需在备份主机生成RSA密钥对(ssh-keygen -t rsa),用ssh-copy-id部署公钥至目标服务器,并在脚本中使用绝对路径、显式声明PATH与SHELL,配合日志重定向和权限校验实现可靠自动备份。

核心是让 crontab 执行的备份命令(如 scp、rsync)不卡在密码输入环节。关键不在 crontab 本身,而在于确保它运行时能静默使用 SSH 密钥完成认证。
生成并部署 SSH 密钥对
在执行备份的机器(即 crontab 所在主机)上操作:
- 运行 ssh-keygen -t rsa,全部按回车跳过密钥路径和 passphrase,生成
~/.ssh/id_rsa(私钥)和~/.ssh/id_rsa.pub(公钥) - 用 ssh-copy-id user@backup-server-ip 把公钥自动追加到目标备份服务器的
~user/.ssh/authorized_keys中;若该命令不可用,可手动复制后执行chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys - 测试:运行
ssh user@backup-server-ip,确认无需输密码即可登录
编写可被 crontab 调用的备份脚本
脚本需明确指定用户、路径与权限,避免因环境差异导致失败:
- 脚本开头加
#!/bin/bash,并用绝对路径调用命令(如/usr/bin/scp、/bin/tar) - 备份源路径、目标路径、时间戳格式统一写死或用
$(date +\%Y\%m\%d)动态生成 - 示例片段:
/usr/bin/scp -o StrictHostKeyChecking=no -P 22 /data/app.tar.gz user@192.168.1.100:/backup/
其中-o StrictHostKeyChecking=no可跳过首次连接确认提示(生产环境建议提前手动连接一次建立 known_hosts 条目) - 保存后赋予执行权限:
chmod +x /opt/scripts/backup.sh
配置 crontab 定时任务
注意 crontab 的运行环境与交互式 shell 不同,PATH 和 HOME 可能受限:
- 推荐用
crontab -e编辑当前用户(如 root)的定时任务,避免权限混淆 - 每晚 2 点执行:
0 2 * * * /opt/scripts/backup.sh > /var/log/backup.log 2>&1 - 务必重定向输出(
> ... 2>&1),否则失败时无日志可查;日志路径也建议用绝对路径 - 若脚本依赖特定环境变量(如 LANG、HOME),可在 crontab 文件顶部显式声明:
HOME=/root<br>PATH=/usr/local/bin:/usr/bin:/bin
验证与排错要点
常见问题基本围绕“为什么免密在终端行,crontab 就不行”:
- 检查私钥权限是否为
600,~/.ssh目录权限是否为700;crontab 下的 HOME 默认可能不是 root,可用whoami && echo $HOME在脚本中打印确认 - 在脚本开头加入
set -x开启调试模式,并把完整输出记入日志,查看实际执行了哪条 ssh 命令、报什么错 - 如果用 rsync,确保远程服务器已启用 rsync daemon 或直接走 ssh 模式(
rsync -avz -e "ssh -p 22" ...) - SELinux 或防火墙未拦截 scp/rsync 端口(默认 22)也可能导致静默失败,查
journalctl -u crond -n 50和ss -tuln | grep :22

















