Como posso retomar uma transferência de arquivo scp grande ao usar o encaminhamento de porta?

9

Eu tenho uma máquina a alguns passos e preciso configurar o encaminhamento de porta para transferir arquivos.

Editar: para ficar claro, os vários saltos são necessários para acessar a máquina remota. Da minha máquina, eu configurei uma VPN, onde eu posso acessar 10.255.x.x - que é a única máquina que eu posso conectar através da VPN. Uma vez logado em .x.x, eu posso me conectar a outras máquinas - .y.y sendo uma delas.

Da minha máquina:

ssh -L 4567:localhost:4567 [email protected]

Então, a partir dessa máquina:

ssh -L 4567:localhost:22 [email protected]

Eu posso então

scp -P 4567 me@localhost:/path/to/large/file.gz .

Eu deixei isso correndo durante a noite, apenas para descobrir que a transferência morreu em algum momento.

Eu já vi algumas sugestões para usar o rsync sobre o ssh para retomar a transferência, mas não estou claro como configurá-lo. Isso é possível?

    
por chris 06.03.2013 / 14:02

4 respostas

9

Com algumas versões do scp (a versão no computador de origem parece ser a chave), apenas a reexecução do comando scp será suficiente para retomar a transferência. Mas tenha cuidado! Se a sua versão não suportar transferências parciais, o arquivo parcial será simplesmente sobrescrito.

Os seguintes switches rsync são úteis para retomar uma transferência quebrada se o scp não suportar:

     --append                append data onto shorter files
     --append-verify         like --append, but with old data in file checksum
 -e, --rsh=COMMAND           specify the remote shell to use
     --progress              show progress during transfer

O comando

rsync --append-verify --progress --rsh="ssh -p 4567" me@localhost:/path/to/large/file.gz .

deve ter o efeito desejado. Observe que a opção -p deve estar em minúsculas para ssh.

    
por 06.03.2013 / 14:52
1

O rsync usa o ssh por padrão, você pode ter que especificar o comando ssh exato usando o switch -e do rsync. Ele também tem um --partial que deve manter o arquivo incompleto em volta para que ele possa retomar a transferência.

    
por 06.03.2013 / 14:51
1

Use sftp em vez de scp

No seu caso:

sftp -a -P 4567 me@localhost:/path/to/large/file.gz .

Na página do manual do sftp:

-a      Attempt to continue interrupted downloads rather than overwriting existing partial or complete copies of files.  If the remote file contents differ from the partial local copy then the resultant file is likely to be corrupt.
    
por 29.09.2016 / 16:25
0

Eu não consigo ver qual é o sentido dos seus túneis, então aqui está como eu resolvo o seu problema:

ssh -R $tunnelPort:localhost:$localSSHPort $remoteUser@$remoteHost -p $remoteSSHPort

isto abre um túnel reverso da máquina local (localhost) para a máquina remota (remotehost). $ tunnelPort é a porta na qual o túnel deve ser encontrado no remotehost. $ localSSHPort é a porta na qual o sshd local é executado e $ remoteSSHPort é onde o sshd do remotehost escuta.

Agora que você está dentro do túnel (invertido!), você pode mais ou menos fazer o que Dennis propôs:

rsync --apend-verify -az -e 'ssh -p $tunnelPort' /path/to/large/file $user@localhost:/destination

os sinalizadores -a e -z são explicados na página do manual do rsync, então não vou elaborar sobre eles. O que acontece agora é que quando você executa o rsync no remotehost como acima, ele envia todos os dados para a porta $ tunnelPort que é então encaminhada para o sshd $ localSSHPort do seu localhost.

Espero que tenha ajudado.

    
por 06.03.2013 / 15:41