rsync --dry-run正常但实际同步失败(本地到VirtualBox via ssh)
我尝试通过SSH将本地机器上某目录的内容同步到我的VirtualBox中,理解的基础语法是:rsync -avzhe ssh [本地根目录路径] [ip]:[目标根目录路径],于是执行了以下命令:
$ rsync -avzhe ssh /Users/user_name/dir1/dir2/dir3/dir4/ 192.168.1.216/home/user_name/dir_a/dir_b/dir_c/
用--dry-run测试时输出正常:
building file list ... 12 files to consider
created directory 192.168.1.216/home/user_name/dir_a/dir_b/dir_c等等,等等,等等sent 412 bytes received 92 bytes 1.01K bytes/sec
total size is 173.42K speedup is 344.08
但实际执行时失败,报错信息如下:
building file list ... 12 files to consider
rsync: mkdir "/Users/user_name/dir1/dir2/dir3/dir4/192.168.1.216/home/user_name/dir_a/dir_b/dir_c" failed: No such file or directory (2)
rsync error: error in file IO (code 11) at /BuildRoot/Library/Caches/com.apple.xbs/Sources/rsync/rsync-47/rsync/main.c(544) [receiver=2.6.9]
rsync: connection unexpectedly closed (8 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at /BuildRoot/Library/Caches/com.apple.xbs/Sources/rsync/rsync-47/rsync/io.c(453) [sender=2.6.9]
请问我忽略了什么问题?
嘿,问题一眼就能看出来——你在远程地址的IP和目标路径之间少了一个冒号!
仔细看你的命令:
rsync -avzhe ssh /Users/user_name/dir1/dir2/dir3/dir4/ 192.168.1.216/home/user_name/dir_a/dir_b/dir_c/
这里的192.168.1.216/home/user_name/...没有冒号,rsync会把这个整个字符串当成本地路径的一部分,所以它尝试在你的本地目录/Users/user_name/dir1/dir2/dir3/dir4/下面创建192.168.1.216/home/user_name/dir_a/dir_b/dir_c这个嵌套目录,自然会因为中间的父目录不存在而报错。
而--dry-run模式下,rsync只是模拟操作流程,没有真正去验证路径的有效性,所以看起来输出“正常”,但其实它已经把目标路径当成本地路径来处理了,只是没实际创建而已。
正确的命令应该是这样的:
rsync -avzhe ssh /Users/user_name/dir1/dir2/dir3/dir4/ 192.168.1.216:/home/user_name/dir_a/dir_b/dir_c/
注意192.168.1.216后面加了:,这个冒号是rsync识别“远程主机路径”的关键——它告诉rsync:前面是远程主机的IP/域名,后面是该主机上的绝对路径。
额外提醒:
- 如果VirtualBox里的用户名和本地用户名不一样,需要加上用户名前缀,比如:
user_vbox@192.168.1.216:/home/user_vbox/... - 路径末尾的斜杠
/很重要:本地目录末尾加斜杠,是把目录里面的内容同步到目标路径;如果不加斜杠,会把整个dir4目录本身同步到目标路径下(也就是目标路径会变成/home/user_name/dir_a/dir_b/dir_c/dir4/)。
内容的提问来源于stack exchange,提问作者brian-welch

