scp para hosts Windows remotos com espaços no caminho: destino ambíguo

0

Eu estou tentando scp um arquivo da minha máquina linux local para uma máquina Windows remota, e estou chegando com algumas inconsistências em como o scp lida com caminhos de arquivos do Windows com espaços ...

Isso funciona, observe que os espaços são escapados corretamente no caminho para o arquivo local:

scp /home/will/file\ with\ spaces.txt remote@host:D:/Users/will/Downloads/

No entanto, isso faz não funcionar, apesar do espaço na pasta "Google Drive" ter escapado corretamente:

scp /home/will/file\ with\ spaces.txt remote@host:D:/Users/will/Google\ Drive/Documents/Computer_Stuff/Home_Lab/folder

Eu já passei por toneladas de recursos on-line, onde as pessoas têm problemas semelhantes, e todas as suas soluções não funcionaram para mim.

Eu tentei colocar o caminho do arquivo do Windows entre aspas duplas, aspas simples, com e sem espaços de escape; Eu tentei usar double \ e triple \\ para escapar de espaços; Eu até tentei escapar do cólon ( D\: ); e tentei explicitamente declarar um nome de arquivo de destino e não. Nada funcionou.

Então eu encontrei esta resposta e somente o método # 2 funciona! Por quê? Qual é a diferença entre cercar o caminho do arquivo do Windows em '" e "' ? Por que eu posso simplesmente escapar de espaços sem usar nenhuma cotação no caminho do arquivo Linux local, mas não no caminho remoto do Windows?

    
por Willman 11.05.2018 / 16:59

1 resposta

1

Seu shell está vendo Google\ Drive e analisando-o como Google , seguido por uma barra invertida literal, um espaço (que separa os argumentos para scp , seguido por Drive e passando para SCP que não sabe o que fazer agora que você está enviando muitos argumentos.

Para tornar isso mais claro, compare como o shell analisa Google\ Drive e Google\ Drive :

$ cat 443236.sh
#!/bin/bash
foo=(Google\ Drive)
echo "Unrolling \$foo[@]:"
for f in "${foo[@]}"; do
  echo "'$f'"
done
foo=(Google\ Drive)
echo "Unrolling \$foo[@]:"
for f in "${foo[@]}"; do
  echo "'$f'"
done
$ ./443236.sh
Unrolling $foo[@]:
'Google Drive'
Unrolling $foo[@]:
'Google\'
'Drive'
    
por 11.05.2018 / 17:14