Permission Denied for Rsync

Bash

相比于 scprsync 命令可以在 SSH 拷贝的时候提供更多的灵活性,比如只拷贝新修改的或未存在的文件。

一个简单的拷贝命令如下:

rsync -auv /local/folder host:/remote/folder

这里,-a 表示拷贝所有的文件(包括子文件夹中的),-u 表示只拷贝修改时间更新的部分,-v 则会将结果输出到 stdin 中方便查看。类似的,还可以使用 --ignore-existing 来要求 rsync 只拷贝新的文件,忽略已经存在的部分。

然而在实际使用的过程中,rsync 有如下报错:

Permission denied, please try again.
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(235) [sender=3.1.2]

如果换同样的 SSH 配置,使用 scp 就不会有类似的报错,可见本身并不是 SSH 登陆账户权限的问题。这里的 Permission denied 报错非常的具有误导性。实际上,更可能的情况是 rsync 无法在远程主机上找到,需要通过 --rsync-path 参数手动指定。

首先,可以先 SSH 到远程主机上,确认 rsync 本身是存在的:

rsync --help

接着,可以通过 type 命令确认 rsync 的实际位置:

type -a rsync

这里,假设输出的结果是 /bin/rsync,那么,可以将原先的 rsync 命令改写为:

rsync -auv /local/folder host:/remote/folder --rsync-path=/bin/rsync

再次运行就不会报错了。

参考文档