是的,我知道你在想什么:“到底是谁命名他们的文件`a`b
?”
但是让我们假设您确实有一个名为`a`b
(可能是由疯狂的 Mac 用户制作的 - 显然不是您制作的)的文件,并且您想要rsync
那个。显而易见的解决方案:
rsync server:'./`a`b' ./.;
rsync 'server:./`a`b' ./.;
给出:
bash: line 1: a: command not found
rsync: [sender] link_stat "/home/tange/b" failed: No such file or directory (2)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1865) [Receiver=3.2.7]
rsync: [Receiver] write error: Broken pipe (32)
甚至:
$ rsync 'server:./\`a\`b' ./.;
bash: line 3: a\: command not found
rsync: [sender] link_stat "/home/tange/\b" failed: No such file or directory (2)
:
rsync
我应该运行的命令是什么?
$ rsync --version
rsync version 3.2.7 protocol version 31
手动平分后,这是 rsync 中的一个错误,由提交 5c93dedf4538(“向 SHELL_CHARS 添加反引号”)修复,它将出现在即将推出的 rsync 3.2.8(尚未发布)中。它被commit 6b8db0f6440b ("Add an arg-protection idiom using backslash-escapes")打破,它在 3.2.4 中。
作为缓解措施,存在使用旧 arg 解析行为 ( ) 的选项
--old-args
:这是一个版本问题。它似乎不依赖于服务器版本,而是依赖于客户端。
v3.2.3 和 v3.2.7 之间出现了一些问题。
好的:
失败:
但严重的是:这似乎是一场等待发生的灾难,你需要引用
`
两次。感谢@dhag 指出问题。
不幸的是,它没有回答如何使用 v3.2.7 版本进行传输。
如果您不必支持
rsync
3.0.0 之前的版本,请使用--secluded-args
aka-s
,以前称为--protect-args
,然后您不必担心远程用户的登录 shell(可能是任何东西)如何解释文件名,因此在通过 rsh/ssh 执行 rsync 时,正确地进行引用/转义几乎是不可能的)。来自手册(此处为 3.2.7):