Escapando espaços em um caminho remoto ao usar o rsync em uma conexão SSH remota

9

Ao usar o SSH para conectar o rsync a um servidor remoto, como você escapa de espaços e tal 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 está sendo lido como uma quebra no caminho, marcando assim o final desse caminho.

Então, quando eu faço rsync -avz /path/to/source/some\ dir/ [email protected]:/path/to/dest/some\ dir/ , o que acontece é que o servidor remoto está lendo apenas /path/to/dest/some/ e não consegue encontrar esse destino remotamente, porque o destino real é "algum dir" em vez de "alguns" ".

Se eu tentar o mesmo comando e escapar da barra invertida e do espaço para passar o prompt bash local e manter a barra invertida para o servidor remoto (três barras invertidas no total: /path/to/dest/some\\ dir/ ), ele envia a barra invertida para o controle remoto servidor, mas o servidor remoto, em seguida, interpreta o caminho como /path/to/dest/some\/ em vez de /path/to/dest/some\ dir/ ainda tirando o espaço e os caracteres após ele.

Se eu tentar enrolar o caminho com aspas, ele se comportará praticamente da mesma maneira, cortando efetivamente o caminho no espaço. Então, também só funciona para passar o prompt do bash local.

Inicialmente eu estava usando um caminho que tinha um segmento "-" (espaço-hífen-espaço) nele, e o servidor remoto estava retornando um erro rsync: on remote machine: -: unknown option , que é o que iniciou todo esse esforço de escape espacial no primeiro Lugar, colocar.

Então, o que devo fazer para que isso funcione corretamente com o servidor remoto, sem ter que remover os espaços ou outros caracteres incorretos como hifens do caminho remoto?

    
por purefusion 13.02.2011 / 03:14

4 respostas

9

Na máquina do iniciador, rsync cria uma linha de comando que invoca o destino rsync na máquina remota e envia essa linha de comando usando ssh .... como uma única string . Essa única string é passada para o shell para analisar, dividir em argumentos e executar rsync . Eu não tenho ideia de por que isso é feito, em vez de empacotar os argumentos (já divididos, expandidos e sem aspas) em algum contêiner seguro para binário para o rsync remoto.

Isso significa que seus argumentos serão analisados por dois shells diferentes, quote e requote de acordo. Geralmente, envolvo cada argumento com aspas duplas e, em seguida, a expressão inteira em aspas simples. às vezes não é o suficiente, ou pode ser complicado se você quiser que a mesma expressão seja usada local e remotamente.

Nesse caso, eu costumo definir alguns links com nomes simples, sem espaços, todos ASCII, e usar isso.

    
por 13.02.2011 / 03:38
3

Você estava no caminho certo quando disse:

If I try the same command and escape the backslash and the space to get past the local bash prompt and maintain the backslash for the remote server

Aqui está uma maneira que acho mais fácil de fazer:

rsync -av dir\ with\ spaces/ server.tld:"dir\ with\ spaces"

e assim também funciona.

rsync -av dir\ with\ spaces/ server.tld:dir\\ with\\ spaces

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?

$ sudo su -
# cd /usr/bin
# mv rsync rsync.real
# cat <<'EOF' >rsync
#!/bin/bash
logfile=/home/yourname/rsync.log
date >> "$logfile"
i=1
for arg in "$@"; do
    echo "arg $i: $arg" >> "$logfile"
    i=$((i+1))
done

rsync.real "$@"
EOF
# chmod +x rsync

Em seguida, execute seu rsync novamente, e isso deve provar que essa maneira de escapar funciona, por exemplo,

Lado do cliente:

Sun Feb 13 13:48:12 EST 2011
1: -av
2: dir with spaces/
3: server:dir\ with\ spaces

Lado do servidor:

Sun Feb 13 13:48:13 EST 2011
1: --server
2: -vlogDtpre.iL
3: .
4: dir with spaces

No exemplo acima, o fato de que o quarto argumento no servidor ( dir with spaces ) está todo em uma linha diz que a cotação está funcionando corretamente.

Se isso não ajudar, tente executar novamente rsync -v ou rsync -vv ou rsync -vvv . Ele fornecerá informações extras de depuração.

Duas outras sugestões bobas:

  • é o outro servidor um servidor Linux e qual é o seu shell padrão?
    • talvez esteja expandindo os nomes dos arquivos de maneira diferente do esperado ...
  • você esqueceu de adicionar a opção -a ou -r ?
    • não posso dizer sem ver sua saída
por 13.02.2011 / 03:37
0

A resposta do ponto:

Use -s (proteja args) 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.

    
por 10.08.2017 / 00:15
-1

Você pode simplesmente colocar seu caminho entre aspas.

    
por 13.02.2011 / 03:37