Como retomar o scp com arquivos parcialmente copiados? [fechadas]

97

Eu uso o comando scp shell para copiar uma pasta enorme de arquivos.

Mas em algum ponto do tempo eu tive que matar o comando em execução (por Ctrl + C ou kill).

No meu entendimento, o scp copiava os arquivos sequencialmente, portanto, deveria haver apenas um arquivo parcialmente copiado.

Como o mesmo comando scp pode ser retomado para não sobrescrever os arquivos copiados com sucesso e para tratar corretamente os arquivos parcialmente copiados?

PS Eu sei que posso fazer esse tipo de coisa no rsync, mas scp é mais rápido para mim por algum motivo e eu o uso.

Bohdan
fonte
4
Suspeito que o rsync é mais lento porque gasta algum tempo extra fazendo coisas que permitem reiniciar uma transferência. Você pode considerar apenas usar o rsync para finalizar a transferência parcial.
Keith Thompson
2
Se você quer ser inteligente, pode sempre tentar ddcom uma skipvariável adequada e canalizar para ssh:)
Mark Nunberg
1
Isso está fora do tópico para SO. Ele pertence ao SuperUser e, de fato , foi solicitado lá .
Dan Dascalescu

Respostas:

185

Você deve usar rsyncmaisssh

rsync -P -e ssh remoteuser@remotehost:/remote/path /local/path

A opção principal é -P, que é a mesma que--partial --progress

Outras opções, como -a(para o modo de arquivo) e -z(para ativar a compactação), também podem ser usadas.

O manual: https://download.samba.org/pub/rsync/rsync.html

Jordi
fonte
43
Só queria observar que o rsync irá retomar uma cópia em lote iniciada com scp muito bem.
Craig Anderson
6
Você obterá "pulando diretório". erro, a menos que você também especifique -r. Fonte: lucasb.eyer.be/snips/rsync-skipping-directory.html
Artur Czajka
4
Funcionou para mim, mas eu adicionei --append também .... rsync -P --append -e ssh remoteuser @ remotehost: / remote / path / local / path
cnd
1
@CraigAnderson esse é o ponto importante que foi deixado de fora. A resposta parece sugerir que o download deveria ter começado com rsync para começar.
Willa
1
As opções fornecidas na resposta não funcionaram para mim, mas funcionou:rsync -P -rsh remoteuser@remotehost:/remote/path /local/path
Bunny Rabbit
26

Uma alternativa ao rsync:

Use sftpcom a opção -r(recursivamente copiar diretórios inteiros) e opção -ade sftp's getcomando para continuar transferências parciais de arquivos existentes.

Pré-requisito: Sua sftpimplementação já tem uma opção getcom -a.

Exemplo:

Copie o diretório /foo/bardo servidor remoto para o diretório atual local. O diretório barserá criado no diretório atual local.

echo "get -a /foo/bar" | sftp -r server
Cyrus
fonte
4
Sua solução é ótima porque meu servidor não permite login em ssh, então o rsync não funciona. Eu precisava fazer upload em vez de baixar, então aqui está o meu comando:echo "put -a foo/bar" | sftp -r server:/foo
Carlos Rafael Ramirez
1
Esta parece uma opção muito viável para retomar arquivos parcialmente baixados, porque o rsync não parece ser muito compatível com ssh (com portas não padrão).
codezombie
11

Desde o OpenSSH 6.3, você pode usar o regetcomando em sftp.

Ele tem a mesma sintaxe de get, exceto que inicia uma transferência a partir do final de um arquivo local existente.

Martin Prikryl
fonte
6

Outra possibilidade é tentar salvar o scp que você já iniciou quando ele travar.

ctrl + z para segundo plano e pare, então ssh para o servidor receptor e faça o login, então saia. Agora fg o processo scp e observe-o retomar de 'estagnado'!

Puckfist
fonte
Funcionou para mim no Mac OS X. Obrigado por postar isso, salvou meu bacon hoje!
Ben Hitchcock
1

Quando o rsync também para após alguns segundos, quando inicialmente estava funcionando bem, acabei com a seguinte solução de força bruta:

cat run_me.sh
#!/bin/bash
while [ 1 ]
do
  rsync --partial --progress --rsh=ssh user@host:/path/file.tgz file.tgz &
  TASK_PID=$!
  sleep 60
  kill $TASK_PID
  sleep 2
done
remigiusz boguszewicz
fonte
1

Você pode usar as opções -rshe -Pde rsync. -Pé para download parcial e -rshindica que a transferência é sobre o ssh procotol.

O comando completo seria: rsync -P -rsh remoteuser@remotehost:/remote/path /local/path

Coelhinho
fonte
-5

Tive o mesmo problema ontem, ao transferir um enorme dump sql via scp, tive sorte com wget --continue the_url

Essa postagem do blog explica muito bem http://www.cyberciti.biz/tips/wget-resume-broken-download.html

Arnaud Bouchot
fonte
É considerada prática recomendada copiar as partes relevantes de um url para a resposta caso o site caia.
Ryre,
Estou tentando fazer upload, então nada de wget para mim.
Rolf