Sim, eu sei o que você está pensando: "Quem diabos nomeia seu arquivo `a`b
?"
Mas vamos supor que você tenha um arquivo chamado `a`b
(possivelmente feito por um usuário maluco do Mac - obviamente não por você), e você deseja rsync
isso. A solução óbvia:
rsync server:'./`a`b' ./.;
rsync 'server:./`a`b' ./.;
dá:
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)
Até:
$ 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)
:
Qual é o rsync
comando que devo executar?
$ rsync --version
rsync version 3.2.7 protocol version 31
Tendo dividido manualmente, este é um bug no rsync e foi corrigido pelo commit 5c93dedf4538 ("Add backtick to SHELL_CHARS.") , que estará no próximo rsync 3.2.8 (ainda não lançado). Ele foi quebrado pelo commit 6b8db0f6440b ("Adicionar um idioma de proteção de argumento usando escapes de barra invertida") , que está em 3.2.4.
Como mitigação,
--old-args
existe uma opção para usar o antigo comportamento de análise de argumentos ( ):É um problema de versão. Parece não depender da versão do servidor, mas do cliente.
Algo foi quebrado entre v3.2.3 e v3.2.7.
OK:
Falha:
Mas falando sério: parece ser um desastre esperando para acontecer, que você precisa citar
`
duas vezes.Obrigado a @dhag por apontar o problema.
Infelizmente não responde como fazer a transferência com a versão v3.2.7.
Se você não tem que suportar versões
rsync
anteriores a 3.0.0, use--secluded-args
aka-s
, anteriormente conhecido como--protect-args
, e então você não precisa se preocupar como os nomes dos arquivos podem ser interpretados pelo shell de login do usuário remoto (que pode ser qualquer coisa , portanto, fazer citações/escape corretamente é praticamente impossível) ao fazer rsync sobre rsh/ssh. Do manual (aqui em 3.2.7):