Comment reprendre scp avec des fichiers partiellement copiés? [fermé]


97

J'utilise la commande scp shell pour copier un énorme dossier de fichiers.

Mais à un moment donné, j'ai dû tuer la commande en cours d'exécution (par Ctrl + C ou tuer).

À ma connaissance, scp copiait les fichiers séquentiellement, il ne devrait donc y avoir qu'un seul fichier partiellement copié.

Comment la même commande scp peut-elle être reprise pour ne pas écraser les fichiers copiés avec succès et pour gérer correctement les fichiers partiellement copiés?

PS Je sais que je peux faire ce genre de choses dans rsync, mais scp est plus rapide pour moi pour une raison quelconque et je l'utilise à la place.


4
Je soupçonne que rsync est plus lent car il passe un peu plus de temps à faire des choses qui vous permettent de redémarrer un transfert. Vous pouvez envisager d'utiliser simplement rsync pour terminer le transfert partiel.
Keith Thompson

2
Si vous voulez être intelligent, vous pouvez toujours essayer ddavec une skipvariable appropriée et diriger vers ssh:)
Mark Nunberg

1
C'est hors sujet pour SO. Il appartient à SuperUser, et a effectivement été demandé là-bas .
Dan Dascalescu

Réponses:


185

Vous devriez utiliser rsyncplusssh

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

L'option clé est -P, qui est la même que--partial --progress

D'autres options, telles que -a(pour le mode archive) et -z(pour activer la compression) peuvent également être utilisées.

Le manuel: https://download.samba.org/pub/rsync/rsync.html


43
Je voulais juste noter que rsync reprendra une copie par lots commencée avec scp très bien.
Craig Anderson

6
Vous obtiendrez "sauter le répertoire". erreur, sauf si vous spécifiez également -r. Source: lucasb.eyer.be/snips/rsync-skipping-directory.html
Artur Czajka

4
Cela a fonctionné pour moi, mais j'ai ajouté --append aussi .... rsync -P --append -e ssh remoteuser @ remotehost: / remote / path / local / path
cnd

1
@CraigAnderson c'est le point important qui a été laissé de côté. La réponse semble suggérer que le téléchargement aurait dû commencer avec rsync pour commencer.
Willa

1
Les options données dans la réponse n'ont pas fonctionné pour moi, mais cela a fonctionné:rsync -P -rsh remoteuser@remotehost:/remote/path /local/path
Bunny Rabbit

26

Une alternative à rsync:

À utiliser sftpavec l'option -r(copier récursivement des répertoires entiers) et l'option -ade sftpla getcommande de pour reprendre les transferts partiels de fichiers existants.

Prérequis: votre sftpimplémentation a déjà une option getavec -a.

Exemple:

Copiez le répertoire /foo/bardu serveur distant vers votre répertoire courant local. Le répertoire barsera créé dans votre répertoire courant local.

echo "get -a /foo/bar" | sftp -r server

4
Votre solution est excellente car mon serveur n'autorise pas la connexion dans ssh, donc rsync ne fonctionne pas. J'avais besoin de télécharger au lieu de télécharger alors voici ma commande:echo "put -a foo/bar" | sftp -r server:/foo
Carlos Rafael Ramirez

1
Cela semble une option très viable pour reprendre des fichiers partiellement téléchargés, car rsync ne semble pas être très convivial pour ssh (avec des ports non par défaut).
codezombie

11

Depuis OpenSSH 6.3, vous pouvez utiliser la regetcommande dans sftp.

Il a la même syntaxe que le get, sauf qu'il démarre un transfert à partir de la fin d'un fichier local existant.


6

Une autre possibilité est d'essayer de récupérer le scp que vous avez déjà commencé lorsqu'il se bloque.

ctrl + z en arrière-plan et arrêtez-le, puis ssh sur le serveur de réception et connectez-vous, puis quittez. Maintenant, fg le processus scp et regardez-le reprendre de «bloqué»!


A travaillé pour moi sur Mac OS X. Merci d'avoir publié ceci, cela a sauvé mon bacon aujourd'hui!
Ben Hitchcock

1

Lorsque rsync se bloque également après quelques secondes lors du démarrage initial, j'ai fini avec la solution de force brute suivante:

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

1

Vous pouvez utiliser les options -rshet -Pde rsync. -Pest pour téléchargement partiel et-rsh indique que le transfert se fait via ssh procotol.

La commande complète serait: rsync -P -rsh remoteuser@remotehost:/remote/path /local/path


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.