根本原因是宝塔用www用户执行任务但其无ssh密钥权限;应改用root或有密钥的用户,设对私钥权限,用绝对路径调用rsync,加--delete/--exclude等参数,并启用--partial/--checksum保障同步准确与续传。

宝塔面板里 rsync 命令总报错 Permission denied (publickey)
根本原因是宝塔默认用 www 用户执行计划任务,但该用户没权限读取你的私钥,也没配置 SSH 免密登录到目标服务器。
实操建议:
- 别用
www用户跑 rsync —— 在计划任务里把「运行用户」改成root(或你有 SSH 密钥的普通用户) - 确保该用户能本机免密
ssh user@host:私钥放在~/.ssh/id_rsa,权限设为600,~/.ssh权限是700 - 如果目标是另一台 Linux 服务器,别用密码认证;rsync over ssh 不支持交互式输密码,必须走密钥
- 测试命令先手动跑一遍:
rsync -avz -e "ssh -p 22" /www/wwwroot/site/ user@192.168.1.100:/backup/site/
rsync 同步时漏文件或反复全量传输
常见于没加 --delete 或路径结尾斜杠不一致,导致 rsync 把源目录当成文件同步,或目标端残留旧文件干扰判断。
实操建议:
- 源路径末尾加
/:用/www/wwwroot/site/而不是/www/wwwroot/site,前者同步内容,后者同步整个目录名 - 删掉目标端多余文件?加
--delete,但务必先加--dry-run看预览,比如:rsync -avz --delete --dry-run -e "ssh -p 22" /www/wwwroot/site/ user@host:/backup/site/ - 跳过 .git、缓存、日志等非必要文件:用
--exclude='.git' --exclude='runtime/' --exclude='logs/' - 注意时间戳:加
-t(默认已有)保留修改时间,否则 rsync 可能因时间不一致误判为变更
宝塔计划任务里 rsync 没反应或提示 command not found
因为宝塔的定时任务 shell 环境极简,PATH 不包含 /usr/bin 或 /usr/local/bin,而 rsync 通常装在这俩地方。
实操建议:
- 别写
rsync,写绝对路径:/usr/bin/rsync(用which rsync确认) - 脚本开头加环境变量(可选):
export PATH="/usr/local/bin:/usr/bin:/bin" - 命令太长容易出错?写成 shell 脚本再调用,比如
/www/backup/sync.sh,计划任务里只执行bash /www/backup/sync.sh - 脚本里第一行加
#!/bin/bash,并用chmod +x赋权
跨服务器同步慢、卡住或中断后无法续传
rsync 默认不压缩、不限速、不重试,公网环境或大文件易失败;而且断点续传依赖文件大小和时间戳,若目标端被手动改过,可能失效。
实操建议:
- 加
-z开启压缩(适合文本类网站文件),但对已压缩的图片、视频反而拖慢 - 限速防占满带宽:
--bwlimit=2000(单位 KB/s),比如限速 2MB/s - 加
--partial --progress:中断后保留已传部分,下次自动续传,并显示进度 - 关键备份加
--checksum:强制按内容比对(非默认的大小+时间),更准但更耗 CPU 和时间










