修复 Windows 平台 rsync 连接失败的问题

最近在 Windows 上用 rsync 又遇到了之前无法连接的问题,想来又是因为自己更新了 msys2 导致之前安装的包又被清掉了,正好借这个机会记录一下之前如何解决 rsync 无法使用的问题。

问题

Rsync 是一个很好用的命令行工具,我们可以借助这个工具很方便地同步本地和远程目录的功能。 不过因为这是一个 unix 系的工具,在 linux 和 OSX 上比较好用,但是 Windows 上想要使用就会需要多花一点时间。这次我又遇到了 rsync 无法连接服务器的问题:

rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(226) [Receiver=3.1.2]
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
      0 [sig] rsync 298! sigpacket::process: Suppressing signal 30 to win32 process (pid 201444)
rsync error: error in rsync protocol data stream (code 12) at io.c(231) [sender=3.2.7]

简单说这是用错了 OpenSSH 库,Windows 自带的 OpenSSH 和 rsync 无法配合使用。

选择

在我的知识范围内,windows 的 rsync 有两种选择,一种是 cwrsync,顾名思义, 这个 rsync 是在 cygwin 下使用的;还有一个是 msys2 下的 rsync,cygwin 下有, msys 基本也会有。安装方法也略有差异,不过对于 cygwin 和 msys 的用户来说,都不会很难。

cwrsync

在我这里,cwrsync 是用 scoop 安装的:

scoop install cwrsync

注意,安装完成后我们还是使用 rsync 命令,而不是 cwrsync。 不过这个时候我们应该还是没办法正常使用,因为 rsync 默认调用了 Windows 自带的 OpenSSH, 这个 ssh 似乎没办法配合 rsync,我们可以通过 PowerShell 的 Get-Command 来确认我们调用的是哪个 ssh:

Get-Command ssh

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Application     ssh.exe                                            8.6.0.1    C:\Windows\System32\OpenSSH\ssh.exe

看到这个基本就是 Windows 自带的 SSH 命令了。这时我们需要告诉 rsync,使用自带的 ssh:

rsync -e '~/scoop/apps/cwrsync/current/bin/ssh.exe'  ...

写起来很繁琐,不过放到脚本文件中其实还好。

msys rsync

使用 msys rsync 也不会很难,而且同样,我们需要先检查下默认 msys 使用的是哪个 ssh:

$ which ssh
/c/Windows/System32/OpenSSH/ssh

也是 windows 自带的 OpenSSH,msys 的 rsync 不包含 OpenSSH,不过直接用 pacman 安装就好:

pacman -S openssh rsync

MSYS 的 OpenSSH 会被安装到他自己的 usr/bin 下

$ which ssh
/usr/bin/ssh

这时再运行 rsync,就正常了。

总结

Windows 上使用 rsync 时,可以使用 cwrsync 或者 msys2 的 rsync,但是需要注意的是,默认的 OpenSSH 并不能配合 rsync,需要手动指定 ssh 命令才能正常使用。(以上总结为 Notion AI编写)

我想可能很多人都会和我一样,工作、生活中需要用到多个操作系统, 而当你在某个系统上使用顺手一个工具时,就会想把这个习惯带到其他系统上,只有一个工具合适嘛, 不过常常这种理念会给我们额外的工作量。所以有时候多系统也会有更多麻烦。