rsync --version成功输出版本号即表示已安装并可用;否则提示“command not found”说明未安装,需按发行版执行对应安装命令(如apt/yum/dnf等),日常SSH同步仅需客户端二进制,无需rsyncd服务。

rsync 不是默认必须安装的工具,但绝大多数现代 Linux 发行版(如 Ubuntu 24.04、CentOS Stream 8+、AlmaLinux 9)已预装。若执行 rsync --version 报“command not found”,说明未安装,需手动补全。
怎么确认 rsync 是否已安装并可用
直接运行:
rsync --version
成功输出版本号(如 rsync version 3.2.7)即表示就绪;否则会提示命令不存在。
常见错误现象:bash: rsync: command not found —— 这不是权限问题,而是包根本没装。
- Debian/Ubuntu 系:用
sudo apt install rsync - RHEL/CentOS/Rocky/AlmaLinux:用
sudo yum install rsync或sudo dnf install rsync - Arch/Manjaro:用
sudo pacman -S rsync - Alpine:用
sudo apk add rsync
注意:rsync 本身不依赖守护进程(rsyncd),日常 SSH 同步只需客户端二进制即可,无需配置 /etc/rsyncd.conf 或启动服务。
rsync 本地 → 远程同步最简可靠写法
用 SSH 通道同步,无需额外服务端配置,只要目标机开了 SSH 且你有对应用户权限即可。
典型命令:
rsync -avzP /path/to/local/ user@host:/path/to/remote/
关键点说明:
-
-a包含递归 + 权限 + 时间戳 + 所有者等,几乎总是要加;单独用-r会丢属性,容易导致脚本或服务异常 -
/path/to/local/末尾的/很关键:有斜杠表示“同步目录内容”,无斜杠表示“同步目录本身”(即多一层嵌套) - 首次运行会传全量,后续只传差异 —— 这是
rsync的核心价值,不是靠定时重跑实现的“伪增量” - 如果远程路径不存在,
rsync不会自动创建父目录,需提前用ssh user@host 'mkdir -p /path/to/remote'
常见翻车场景:漏掉末尾斜杠,结果把整个 local 目录塞进了 remote 下,变成 /path/to/remote/local/。
如何避免 rsync 覆盖已有文件或误删
--delete 是双刃剑:它让目标严格等于源,但一旦源删了文件,目标也会跟着删 —— 生产环境不加 --delete 更安全。
更稳妥的做法:
- 加
--dry-run先预览实际将发生的操作:rsync -avz --dry-run source/ dest/ - 加
--backup和--suffix=.bak,覆盖前自动备份旧文件为file.txt.bak - 加
--ignore-existing,跳过目标已存在的同名文件(适合只追加不覆盖) - 慎用
--delete-after:它在传输完成后才删目标多余文件,比--delete(传输中删)略可控,但仍建议先--dry-run
注意:--delete 只在目标是目录且用了 -a 或 -r 时生效;对单个文件无效。
定时同步别只靠 crontab 写死密码
用 crontab -e 添加类似这一行:
0 2 * * * rsync -az /data/ user@backup-server:/backups/
但这里隐含一个严重隐患:如果远程主机改密钥、SSH 配置变更,或 cron 环境缺失 $HOME 导致无法读取 ~/.ssh/id_rsa,任务就会静默失败。
必须检查的三件事:
- 用目标用户的 shell 手动执行一次该命令,确认免密登录通(
ssh user@backup-server true应立刻返回) - 确保 cron 使用的是完整路径:
/usr/bin/rsync而非仅rsync(可查which rsync) - 在 crontab 头部显式设置环境:
SHELL=/bin/bash、HOME=/home/user,否则~展开可能出错
真正健壮的定时同步,往往配合日志重定向与简单校验(比如同步后 ls -lR | sha256sum 记录快照),而不是只看 cron 是否“没报错”。


















