Ao usar o SSH para conectar o rsync a um servidor remoto, como você evita espaços e outras coisas no caminho remoto? Uma barra invertida simples escapa do espaço para o prompt do bash local, mas na máquina remota o espaço é lido como uma interrupção no caminho, marcando assim o final desse caminho.
Então, quando eu faço o rsync -avz /path/to/source/some\ dir/ [email protected]:/path/to/dest/some\ dir/
que acontece, o servidor remoto está lendo isso como justo /path/to/dest/some/
e uma vez que não consegue encontrar esse destino remotamente, porque o destino real é "alguns dir" em vez de apenas "alguns".
Se eu tentar o mesmo comando e escapar da barra invertida e do espaço para passar pelo prompt do bash local e manter a barra invertida do servidor remoto (três barras invertidas no total :) /path/to/dest/some\\\ dir/
, ela enviará a barra invertida para o servidor remoto, mas o servidor remoto depois interpreta o caminho como /path/to/dest/some\/
ao invés de /path/to/dest/some\ dir/
ainda remover o espaço e os caracteres após ele.
Se eu tentar quebrar o caminho com aspas, ele se comportará da mesma maneira, cortando efetivamente o caminho no espaço. Por isso, também funciona apenas para passar pelo prompt do bash local.
Inicialmente, eu estava usando um caminho que continha um segmento "-" (espaço-hífen-espaço) e o servidor remoto estava retornando um erro rsync: on remote machine: -: unknown option
que foi o que deu início a todo esse esforço de escape de espaço.
Então, o que devo fazer para que isso funcione corretamente com o servidor remoto, sem precisar remover os espaços ou outros caracteres incorretos, como hífens, do caminho remoto?
-s
problema é resolvido sem a necessidade de aplicar escape duplo manualmente.Respostas:
Na máquina do iniciador,
rsync
cria uma linha de comando que chama o destino rsync na máquina remota e envia essa linha de comando usando ssh .... como uma única sequência . Essa única cadeia é passada ao shell para analisar, dividir em argumentos e executarrsync
. Eu não tenho idéia do por que isso foi feito, em vez de empacotar os argumentos (já divididos, expandidos e sem aspas) em algum contêiner de segurança binária no rsync remoto.Isso significa que seus argumentos serão analisados por duas conchas diferentes, citar e refazer de acordo. Normalmente, envolvo cada argumento entre aspas duplas e, em seguida, toda a expressão entre aspas simples. às vezes, não é suficiente ou pode ser complicado se você deseja que a mesma expressão seja usada local e remotamente.
Nesses casos, geralmente defino alguns links simples com nomes simples, sem espaços e todos ASCII, e utilizo isso.
fonte
'[email protected]:"/path/to/dest/some\ dir/"'
eval
ou através de uma chamada para uma função, talvez?Você estava no caminho certo quando disse:
Aqui está uma maneira que eu acho mais fácil:
e dessa maneira funciona também.
Você pode postar a saída exata e os erros que está vendo?
Você pode substituir
rsync
nos dois lados por um script de wrapper?Em seguida, execute o seu rsync novamente e deve provar que essa maneira de escapar funciona, por exemplo,
Lado do cliente:
Lado do servidor:
No exemplo acima, o fato de o quarto argumento no servidor (
dir with spaces
) estar em uma linha indica que a citação está funcionando corretamente.Se isso não ajudar, tente executar novamente
rsync -v
, oursync -vv
, oursync -vvv
. Ele fornecerá informações extras sobre depuração.Duas outras sugestões tolas:
-a
ou-r
?fonte
A resposta do ponto:
Use -s (proteja os argumentos) e coloque seu caminho entre aspas:
rsync -savz user@server:"/my path with spaces/another dir/" "/my destination/"
Funciona com espaços ou traços.
fonte
Você pode apenas colocar seu caminho entre aspas.
fonte