rsync-3.1.1 不与 rsync-3.1.3 同步

rsync-3.1.1 不与 rsync-3.1.3 同步

我最近升级到了 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)

相关内容