相比于 scp
,rsync
命令可以在 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
再次运行就不会报错了。