scp com falha de ponto-e-vírgula para escapar do segundo ponto e vírgula

7

Não consigo fazer esse comando funcionar:

scp fx-devel1:/home/user/gege/feed.zip;2 fx-devel2:/home/user/gege/feed.zip;3

Eu tentei:

scp "fx-devel1:/home/user/gege/feed.zip;" "fx-devel2:/home/user/gege/feed.zip\;3"

ainda parece que só escapa o primeiro ';' como isso aparece:

feed.zip;2                                                    100%  302KB 301.8KB/s   00:00
bash: 3: command not found

Como faço para que funcione? Eu gostaria de incluir o '; 3' no nome do arquivo de destino.

EDITAR: Eu posso fazer isso funcionar quando eu improviso - eu tenho que usar o mv após a transferência:

scp 'fx-devel1:/home/user/gege/feed.zip\;2' fx-devel2:/home/user/gege/feed.zip

ssh fx-devel2 mv /home/user/gege/feed.zip '/home/user/gege/feed.zip\;3'

Mas isso significa muito mais tempo. Ao transferir milhares de arquivos, isso quase dobraria o tempo de acesso aos servidores.

    
por InnZaayynn 01.02.2017 / 08:20

2 respostas

1

Isso funcionou para mim:

/tmp $ ls foo*
'foo;2'
/tmp $ scp 'foo;2' 'localhost:/tmp/foo\;3'
Password:
foo;2                                            100%    0    0.0KB/s    0.0KB/s    00:00
/tmp $ ls foo*
'foo;2'  'foo;3'
/tmp $
    
por 21.02.2017 / 16:35
0

No bash single ( ' ) e double ( " ) aspas podem ser usadas para citar um ponto e vírgula. Não há necessidade de colocar uma barra invertida extra dentro da string citada para citá-las. Você precisa da barra invertida para citar alguns caracteres especiais dentro de aspas duplas, mas o ponto-e-vírgula não é um deles ( " e \ , por exemplo, são).

Após um teste, concluo que a mensagem Command not found vem da máquina remota! Então, o que precede é verdade, pelo menos não enquanto um shell estiver envolvido! Mas aqui o nome do arquivo de destino parece ser passado para o shell do outro lado de alguma forma.

Então, se o seu arquivo é chamado de /home/user/gege/feed.zip;2 e deve ser salvo como /home/user/gege/feed.zip;3 na outra máquina, um deles deve funcionar

scp 'fx-devel1:/home/user/gege/feed.zip;2' 'fx-devel2:/home/user/gege/feed.zip\;3'
scp "fx-devel1:/home/user/gege/feed.zip;2" "fx-devel2:/home/user/gege/feed.zip\;3"
scp fx-devel1:/home/user/gege/feed.zip\;2 fx-devel2:/home/user/gege/feed.zip\\;3

Você pode fazer alguns testes de como as citações no shell funcionam (e obviamente ler a parte relevante da man page) com esta função:

test_quoting () {
  printf 'Number of args: %s\n' "$#"
  printf 'First arg: %s\n' "$1"
}
test_quoting abc def
test_quoting "abc def"
test_quoting 'xyz;123'
test_quoting foo\;bar
test_quoting 'foo\;bar'
# and so on
    
por 01.02.2017 / 10:21