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

10

Eu tenho uma máquina a alguns saltos de distância e preciso configurar o encaminhamento de porta para transferir arquivos.

Editar: para ficar claro, são necessários vários saltos para acessar a máquina remota. Na minha máquina, configurei uma VPN, onde posso acessar 10.255.xx - essa é a única máquina à qual posso me conectar por meio da VPN. Depois de fazer o login no .xx, posso conectar-me a outras máquinas - .yy 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 funcionando demais, apenas para descobrir que a transferência morreu em algum momento.

Já vi algumas sugestões para usar o rsync over ssh para retomar a transferência, mas não sei como configurá-lo. Isso é possível?

chris
fonte
Para que servem todos esses saltos? Não scp [email protected]:/path/to/large/file.gz .alcançaria exatamente o mesmo? Qual versão do scp (ssh) está instalada no cliente e no servidor?
Dennis
@Dennis: scp não suporta a retomada de uma transferência - o que você sugere irá reiniciar o download.
chris
Algumas versões fazem (o scp do meu laptop faz, o meu VPS não). A razão pela qual estou perguntando é porque o lúpulo parece desnecessário para mim, e sincronizar sem lúpulo será muito mais fácil.
Dennis
Esta resposta pode ajudá-lo também: unix.stackexchange.com/a/43097/14084
Bernhard

Respostas:

9

Em algumas versões do scp (a versão no computador de origem parece ser a chave), basta executar novamente o comando scp para reiniciar a transferência. Mas tenha cuidado! Se sua versão não suportar transferências parciais, o arquivo parcial será simplesmente substituído.

Os seguintes switches rsync são úteis para retomar uma transferência interrompida 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 o -pcomutador deve estar em minúsculas para o ssh.

Dennis
fonte
Os saltos são necessários devido à maneira como a rede no servidor de destino está configurada. O problema com o uso do rsync sobre ssh é que eu preciso usar a porta local 4567, o arquivo não existe no servidor 10.255.xx.
chris
Meu erro. Eu estava assumindo que 10.255.y.yera o computador cliente.
1013 Dennis
Eu atualizei minha resposta.
Dennis
e o que fazer se não houver maneira de usar o rsync? No meu caso, tenho apenas ftp disponível no host remoto.
dr.dimitru
11
@ Enzo A pergunta é sobre SCP, a resposta precisa ser sobre scp. A questão é sobre uma transferência scp incompleta, não sobre a ferramenta scp. Ele literalmente diz que vi algumas sugestões para usar o rsync over ssh para retomar a transferência, mas não sei como configurá-lo. Isso é possível? no fundo.
Dennis
2

Use sftp em vez de scp

No seu caso:

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

Na página de 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.
AlexR
fonte
1

O rsync usa ssh por padrão; talvez seja necessário especificar o comando ssh exato usando a opção -e do rsync. Ele também possui um --partial, que deve manter o arquivo incompleto, para que possa retomar a transferência.

Luke Hollins
fonte
-1

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

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

isso abre um túnel reverso da máquina local (localhost) para a máquina remota (remotehost). $ tunnelPort é a porta na qual o túnel pode 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 (reverso!), 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 de manual do rsync, portanto, não os elaborarei. 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 localhost.

Espero que tenha ajudado.

engenhoso
fonte
@ingenous: eu adicionei uma explicação para os túneis.
chris