我最近升级到了 Rtools-3.5(本问题的附属品),其中包括 rsync-3.1.3。在使用 Rtools-3.4(rsync-3.1.1)的另一台笔记本电脑上,简单的命令rsync -aHAX remote:/path/to/dir/* .
就可以正常工作,但使用 3.1.3 时却不行。为了排除故障,我cyg*.dll
从 Rtools-3.4 复制了 rsync-3.1.1 可执行文件(附带),因此现在我有两组可执行文件:3.1.1(旧版,可以工作)和 3.1.3(新版,无法工作)。3.1.1 版本可以工作。
配置ssh
相同,ssh-agent
运行良好(通过 KeePass/KeeAgent),并且ssh
(来自适用于 Windows 的 Git,版本OpenSSH_7.7p1, OpenSSL 1.0.2o 27 Mar 2018
(如果重要)到远程服务器正常工作。
我以为另一个问题“https://unix.stackexchange.com/questions/389908“ 足够相似,但在这个问题上,所有版本的 rsync 都是相同的。
旧版本:
$ ~/rs/rsync --version
rsync version 3.0.9 protocol version 30
Copyright (C) 1996-2011 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
Capabilities:
64-bit files, 64-bit inums, 32-bit timestamps, 64-bit long ints,
no socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,
append, ACLs, xattrs, iconv, symtimes
较新版本:
$ /c/Rtools/bin/rsync --version
rsync version 3.1.3 protocol version 31
Copyright (C) 1996-2018 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
Capabilities:
64-bit files, 64-bit inums, 32-bit timestamps, 64-bit long ints,
socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,
append, ACLs, no xattrs, iconv, symtimes, prealloc
我尝试了一下rsync -e 'ssh -vv' ...
,似乎没有什么问题:日志报告没有问题,密钥被接受,并以以下内容结束:
debug2: input_userauth_pk_ok: fp SHA256:g2VNSDTf5fNp46rZUo4GmAVi84gSNA9nNbT9KKfGXP0
debug1: Enabling compression at level 6.
debug1: Authentication succeeded (publickey).
Authenticated to my.remote.host ([11.22.33.44]:22).
dup() in/out/err failed
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.3]
3.1.1 版的相同命令运行正常。该错误通常表示远程目录/文件不存在,但显然并非如此(因为 3.1.1 版可以正常运行)。
看起来 Rtools 已经改变了它们的编译选项,因为比较两者的功能发现了一些差异:
## Versions: 3.1.1 3.1.3
$ diff -uw <( ~/rs/rsync --help) <( /c/Rtools/bin/rsync --help) | head -n 20
--- /dev/fd/63 2018-08-12 17:48:25.000000000 -0700
+++ /dev/fd/62 2018-08-12 17:48:25.000000000 -0700
@@ -1,10 +1,10 @@
-rsync version 3.0.9 protocol version 30
-Copyright (C) 1996-2011 by Andrew Tridgell, Wayne Davison, and others.
+rsync version 3.1.3 protocol version 31
+Copyright (C) 1996-2018 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
Capabilities:
64-bit files, 64-bit inums, 32-bit timestamps, 64-bit long ints,
- no socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,
- append, ACLs, xattrs, iconv, symtimes
+ socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,
+ append, ACLs, no xattrs, iconv, symtimes, prealloc
因此他们添加socketpairs
并删除了xattrs
。我读过的其他页面让我相信它与有关xattrs
,但我并不完全相信这一点,也不知道如何真正测试它。
远端是:
$ rsync --help | head -n 20
rsync version 3.1.1 protocol version 31
Copyright (C) 1996-2014 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
Capabilities:
64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,
append, ACLs, xattrs, iconv, symtimes, prealloc
进一步表明这xattrs
可能是关键。
看着Rsync 安全公告,他们提出了三件似乎可能相关的事情:
如果您使用早于 3.1.3 版本的 rsync 作为客户端并从您可能不完全信任的 rsync 服务器接收 xattrs,则恶意(修改过的)服务器可能会发送非空终止的 xattr 名称以溢出 xattr 读取缓冲区。
如果您正在运行版本早于 3.1.3 的可写 rsync 守护程序,并且您不完全信任向您发送文件的用户,则应该添加规则“拒绝选项 = 保护参数”。
如果您使用 3.1.2 之前的 rsync 版本作为客户端并从您可能不完全信任的 rsync 服务器接收文件,则此版本会在文件列表中添加额外的检查,以防止发送方调整路径和/或传输请求,从而可能导致在传输目的地之外接收文件。
我尝试了一些变量组合(例如-X
)来尝试修复此问题,但找不到任何方法让 3.1.3 版本正常工作。在此期间,我可以使用 3.1.1 来做我需要做的事情,但我还可以在命令行上检查和/或更改什么来让一切正常工作?
(win10_64,GfW-2.18.0,远程是带有 rsync-3.1.1 的 ubuntu-16.04)