18 votes

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

Je télécharge de temps en temps un très gros fichier via scp et il y a à chaque fois un petit risque que la connexion s'interrompe et coupe le transfert à mi-chemin.

Existe-t-il un moyen de le reprendre ?

20voto

James Mertz Points 390

Avec scp , non.

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

15voto

yrk Points 282

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

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

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

8voto

Daniel Liston Points 336

Oui, il existe des moyens de reprendre à partir du point d'interruption, mais ce n'est pas possible avec scp. sftp reget filename fait ce dont vous avez besoin. Yarek et Grawity ont fourni des solutions valables 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 station de travail locale (téléchargement). N'oubliez pas que les deux derniers paramètres doivent être considérés comme fichier_source et fichier_cible 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 :

#From local to remote
sofar=\`ssh remote\_system ls -l interrupted\_file | awk '{print $5}'\`;
dd if=source\_file bs=1 skip=$sofar | ssh remote\_system "cat >> ./interrupted\_file"

Et pour la solution rsync, j'ajoute -e ssh . Vous devez déterminer si vous avez besoin ou non de la verbosité, de la compression, de la préservation de la propriété, des permissions, de l'horodatage, de la récursivité des répertoires, etc. Consultez les pages de manuel et Google concernant le paramètre -L. Il se peut que vous souhaitiez que les liens symboliques restent des liens au lieu de les référencer.

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

6voto

knocte Points 4546

Il existe une autre solution (en plus de la rsync ou dd solutions énoncées ici) que je suis surpris que personne n'ait mentionnée : c'est la reput commande de sftp .

2voto

AvatarOfChronos Points 424
scp -o ConnectTimeout 60

Permet de spécifier le délai d'attente pour une connexion. Cela peut empêcher la rupture de la connexion.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X