Windows终端使用Rsync向Ubuntu VPS传输文件遇code 12错误(SSH密钥认证正常但Rsync异常)
最近我在Windows上用Rsync往Ubuntu VPS传文件时踩了不少SSH相关的坑,折腾一番后梳理出了问题的来龙去脉,这里分享给大家:
遇到的问题
虽然Rsync有Windows版本,但和SSH搭配时问题多多:
- 直接用Rsync传文件时,会莫名抛出
error in rsync protocol data stream (code 12)的错误,完全传不了; - 后来尝试指定
-e /bin/ssh参数,终于能传文件了,但这个方法只在VPS开启密码认证时有效——可实际生产环境里,VPS基本都会禁用密码认证、只用SSH密钥,这显然不符合安全要求; - 最后卡在了:如何让Windows下的Rsync自动使用SSH密钥认证,不用手动指定密钥路径(毕竟要做自动化,手动指定路径太麻烦)。
准备工作
先做了基础配置:
- 把生成的SSH密钥信息加到了
~/.ssh/config里,内容如下:
Host 160.XXX.XXX.97(deployer) HostName 160.XXX.XXX.97 User deployer IdentityFile ~/.ssh/JXXXXXX-HomePage
- 为了不用每次输入密钥的密码,设置了ssh-agent自动启动:
sss config ssh-agent start=auto
排查实验流程
我一步步验证,缩小问题范围:
步骤1:PowerShell中测试SSH认证
借助ssh-agent,不用反复输密码,直接执行:ssh deployer@160.XXX.XXX.97
连接完全正常,说明密钥和ssh-agent的配置没问题。
步骤2:WSL中测试SSH认证
同样执行上面的命令,连接依然正常,进一步确认VPS端的SSH配置没有问题。
步骤3:WSL中用Rsync传文件
执行这条命令:rsync -azve ssh 04-ProductionBuild deployer@160.XXX.XX.97:/var/www/example.jp
文件成功传输完成,这说明问题不在VPS端,而是Windows原生Rsync的适配问题。
步骤4:Windows终端中用Rsync传文件
执行命令:rsync -azvr -e /bin/ssh --progress ./04-ProductionBuild/ deployer@160.XXX.XX.97:/var/www/example.jp
结果弹出了主机认证提示:
The authenticity of host '160.XXX.XX.97 (160.XXX.XX.97)' can't be established.
ED25519 key fingerprint is SHA256:NFthXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTG/Y.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
明明之前已经把这个VPS加到known_hosts里了,而且单独用SSH连接完全正常。但输入yes后,又出现了报错:
Failed to add the host to the list of known hosts (/known_hosts).
Connection closed by 160.XXX.XX.97 port 22
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(231) [sender=3.2.7]
初步结论
目前看下来,Windows原生Rsync在读取SSH配置(包括known_hosts和密钥路径)时存在路径识别的问题,而WSL环境下的Rsync能正常调用系统的SSH配置,所以暂时可以用WSL里的Rsync作为替代方案。如果要彻底解决Windows原生Rsync的问题,可能需要检查它的SSH路径配置,确保它能正确读取~/.ssh目录下的config和known_hosts文件。
备注:内容来源于stack exchange,提问作者Tokugawa Takeshi YD

