Existe-t-il un moyen de reprendre une scp interrompue d'un fichier?

11

Je télécharge parfois un très gros fichier via scp et il y a une petite chance à chaque fois que la connexion baisse et coupe le transfert à mi-chemin.

Existe-t-il un moyen de le reprendre?

GJ.
la source

Réponses:

9

Vous pouvez essayer l'approche suivante: au lieu de scp, utilisez dd pour ignorer la partie téléchargée et ajouter le reste au fichier.

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

Optimisation possible: travailler avec de gros blocs. Laissons cela comme un devoir.

yrk
la source
Je n'ai pas encore testé cela, mais j'accepte provisoirement la réponse, car l'utilisation de dd semble être une excellente approche pour la solution.
GJ.
Je viens de le tester, fonctionne parfaitement, merci!
Kossak
@Kossak, agréable à entendre!
yrk
ddavec de petites tailles de blocs peut être lent (seulement 350 kB / s ici). Heureusement, les scptransferts semblent provenir de blocs de 1024 octets. Si oui pour votre fichier (ou bien, en tronquant au plus proche bloc de 1024 octets), vous pouvez accélérer comme ceci: ssh rsys "dd if=./srcfile bs=1024 skip=$sofar" >> ./destfile. (Notez qu'il $sofardoit alors y avoir le nombre de blocs de 1024 octets à ignorer!)
tanius
2
Il m'a fallu un certain temps pour réaliser que rsysdans la deuxième ligne est juste un exemple de nom d'hôte et non un argument spécial ssh. Je vous suggère de le remplacer par user@hostpour éviter toute confusion.
Ahmed Essam
7

Avec scp, non.

Si les deux extrémités l'ont, vous pouvez utiliser rsync -LvzP remoteserver:path/to/file localfilepour transférer un seul fichier.

user1686
la source
Cela m'a sauvé des heures de téléchargement d'un énorme fichier qui a été interrompu. Je vous remercie.
phette23
3

Oui, il existe des moyens de reprendre à partir du point d'interruption, mais il n'est pas possible d'utiliser scp. sftp reget filenamefait ce dont vous avez besoin. Yarek et Grawity ont fourni des solutions valides que je +1 aux deux, mais pour reprendre à partir d'un point d'interruption, j'aime rsync. Les exemples de commandes fournis supposent tous deux que vous récupérez un fichier d'un serveur distant vers votre poste de travail local (téléchargement). Veuillez garder à l'esprit que les deux derniers paramètres doivent être considérés comme source_file et target_file dans cet ordre. La syntaxe du nom de fichier varie selon que le fichier source ou cible est local ou distant. Si j'envoyais (téléchargeais) des fichiers [texte], je réécrirais les exemples fournis comme suit:

# Du local au distant
sofar = `ssh remote_system ls -l fichier_interrompu | awk '{print $ 5}' ';
dd if = fichier_source bs = 1 skip = $ sofar | ssh remote_system "cat >> ./interrupted_file"

Et à la solution rsync, j'ajoute -e ssh. Vous devez déterminer si vous avez besoin ou non de verbosité, de compression, de préserver la propriété, les autorisations, l'horodatage, les répertoires récurrents, etc. Vérifiez les pages de manuel et Google, concernant le paramètre -L. Vous pouvez souhaiter que les liens symboliques restent en tant que liens au lieu de les référencer.

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

Daniel Liston
la source
1

Il y a une autre solution (en plus de la rsyncou des ddsolutions énoncées ici) dont je suis surpris que personne n'ait parlé: c'est la reputcommande de sftp.

knocte
la source
0
scp -o ConnectTimeout 60

Vous permet de spécifier le délai d'expiration d'une connexion. Peut empêcher votre connexion de se rompre.

user1055604
la source
0

Oui, si les deux extrémités prennent en charge sftp - après l' scp remoteuser@remotehost:/absolute/filename .échec, vous pouvez reprendre en faisant sftp remoteuser@remotehost, puis reget /absolute/filenamereprendre le téléchargement.

Jason Drane
la source