Existe uma maneira de retomar um scp interrompido de um arquivo?

11

Ocasionalmente, estou baixando um arquivo muito grande via scp e há uma pequena chance de cada vez que a conexão cai e corta a transferência no meio do caminho.

Existe uma maneira de retomar isso?

GJ.
fonte

Respostas:

9

Você pode tentar o seguinte procedimento: em vez de scp, use dd para pular a parte baixada e anexar o restante ao arquivo.

sofar=`ls -l ./destfile | awk '{print $5}'`
ssh rsys "dd if=./srcfile bs=1 skip=$sofar" >> ./destfile

Possível otimização: trabalhe com grandes blocos. Vamos deixar isso como uma lição de casa.

yrk
fonte
Ainda não testei isso, mas estou aceitando a resposta provisoriamente, pois o uso do dd parece uma ótima abordagem para a solução.
GJ.
Acabei de testar, funciona perfeitamente, obrigado!
Kossak
@ Kossak, bom ouvir!
yrk
ddcom tamanhos de bloco pequenos pode ser lento (apenas 350 kB / s aqui). Felizmente, as scptransferências parecem ocorrer em blocos de 1024 bytes. Se assim for para o arquivo (ou mais, truncando-lo para o 1024 byte bloco mais próximo), você pode acelerá-lo como este: ssh rsys "dd if=./srcfile bs=1024 skip=$sofar" >> ./destfile. (Note-se que $sofar, em seguida, tem que ser o número de blocos de 1024 bytes para pular!)
tanius
2
Levei algum tempo para perceber que rsysna segunda linha é apenas um exemplo de nome de host e não um argumento especial ssh. Eu sugiro que você substitua por user@hostpara evitar confusão.
Ahmed Essam
7

Com scp, não.

Se ambas as extremidades tiverem, você pode usar rsync -LvzP remoteserver:path/to/file localfilepara transferir um único arquivo.

user1686
fonte
Isso me salvou horas de baixar um arquivo enorme que foi interrompido. Obrigado.
phette23 26/03
3

Sim, existem maneiras de retomar a partir do ponto de interrupção, mas não é possível usar o scp. sftp reget filenamefaz o que você precisa. Yarek e Grawity forneceram soluções válidas que eu +1 para ambos, mas, para retomar de um ponto de interrupção, eu gosto de rsync. Os comandos de exemplo fornecidos assumem que você está recuperando um arquivo de um servidor remoto para sua estação de trabalho local (download). Lembre-se de que os dois parâmetros finais devem ser considerados no arquivo de origem e no arquivo de destino nessa ordem. A sintaxe do nome do arquivo varia de acordo com o local ou o arquivo de destino ser local ou remoto. Se eu estivesse enviando (carregando) arquivos [texto], reescreveria os exemplos fornecidos como:

# Do local para o remoto
sofar = `ssh remote_system ls -l interrupted_file | awk '{print $ 5}' ';
dd se = arquivo_de_arquivo bs = 1 pular = $ sofar | ssh remote_system "cat >> ./interrupted_file"

E para a solução rsync, eu adiciono -e ssh. Você deve considerar se precisa ou não de verbosidade, compactação, preservar propriedade, permissões, carimbo de data e hora, diretórios de recuperação, etc. Verifique as páginas de manual e o google em relação ao parâmetro -L. Você pode querer que os links simbólicos permaneçam como links em vez de referenciá-los.

rsync -P -e ssh local_source_file remoteserver:path/to/interrupted_target_file

Daniel Liston
fonte
1

Há outra solução (além das rsyncou ddsoluções mencionadas aqui) que surpreende ninguém mencionar: é o reputcomando sftp.

knocte
fonte
0
scp -o ConnectTimeout 60

Permite especificar o tempo limite para uma conexão. Pode impedir a sua conexão.

user1055604
fonte
0

Sim, se ambas as extremidades oferecerem suporte ao sftp - after scp remoteuser@remotehost:/absolute/filename .falhar, você poderá continuar fazendo sftp remoteuser@remotehoste depois reget /absolute/filenamecontinuar o download.

Jason Drane
fonte