C'è un modo per riprendere uno scp interrotto di un file?


11

Di tanto in tanto sto scaricando un file di grandi dimensioni tramite scp e ogni volta che la connessione si interrompe e interrompe il trasferimento a metà strada c'è una piccola possibilità.

C'è un modo per riprenderlo?

Risposte:


9

Puoi provare il seguente approch: invece di scp usa dd per saltare la parte scaricata e aggiungere il resto al file.

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

Possibile ottimizzazione: lavorare con blocchi di grandi dimensioni. Lasciamo questo come compiti a casa.


Non l'ho ancora testato, ma sto accettando la risposta provvisoriamente poiché l'uso di dd sembra un ottimo approccio per la soluzione.
GJ.

L'ho appena provato, funziona perfettamente, grazie!
Kossak,

@Kossak, bello sentire!
anno

ddcon blocchi di piccole dimensioni può essere lento (solo 350 kB / s qui). Fortunatamente, i scptrasferimenti sembrano arrivare in blocchi da 1024 byte. Se è così per il file (oppure, troncando al blocco di byte più vicino 1024), è possibile accelerarlo in questo modo: ssh rsys "dd if=./srcfile bs=1024 skip=$sofar" >> ./destfile. (Nota che $sofardeve essere il numero di blocchi da 1024 byte da saltare!)
tanius

2
Mi ci è voluto un po 'di tempo per rendermi conto che rsysnella seconda riga è solo un esempio di nome host non un argomento speciale per ssh. Ti suggerisco di sostituirlo con user@hostper evitare confusione.
Ahmed Essam,

7

Con scp, no.

Se entrambe le estremità hanno, è possibile utilizzare rsync -LvzP remoteserver:path/to/file localfileper trasferire un singolo file.


Questo mi ha permesso di risparmiare ore per scaricare un enorme file che è stato interrotto. Grazie.
phette23,

3

Sì, ci sono modi per riprendere dal punto di interruzione, ma non è possibile usare scp. sftp reget filenamefa quello che ti serve. Yarek e Grawity hanno fornito soluzioni valide che ho fatto +1 su entrambi, ma per riprendere da un punto di interruzione, mi piace rsync. I comandi di esempio forniti presuppongono entrambi che si stia recuperando un file da un server remoto sulla workstation locale (download). Si prega di tenere presente che gli ultimi due parametri devono essere considerati file_origine e file_file in quell'ordine. La sintassi del nome file varia in base al fatto che il file di origine o di destinazione sia locale o remoto. Se inviassi (caricando) file [testuali], riscriverei gli esempi forniti come:

# Dal locale al remoto
sofar = `ssh remote_system ls -l interrted_file | awk '{print $ 5}' ';
dd if = file_origine_s bs = 1 skip = $ sofar | ssh remote_system "cat >> ./interrupted_file"

E alla soluzione rsync, aggiungo -e ssh. Dovresti considerare se hai bisogno di verbosità, compressione, preservare la proprietà, autorizzazioni, timestamp, directory di recurse, ecc. Controlla le pagine man e google, riguardo al parametro -L. È possibile che i collegamenti simbolici rimangano come collegamenti anziché fare riferimento a essi.

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


1

C'è un'altra soluzione (oltre al rsynco ddsoluzioni indicate qui), che sono sorpreso nessuno ha menzionato: è il reputcomando della sftp.


0
scp -o ConnectTimeout 60

Consente di specificare il timeout per una connessione. Potrebbe impedire la rottura della connessione.


0

Sì, se entrambe le estremità supportano sftp - dopo scp remoteuser@remotehost:/absolute/filename .non riesce è possibile riprendere facendo sftp remoteuser@remotehoste quindi reget /absolute/filenameriprendere il download.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.