web-dev-qa-db-fra.com

Comment reprendre scp avec des fichiers partiellement copiés?

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 kill).

À ma connaissance, scp a copié les fichiers de manière séquentielle; 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 gérer correctement les fichiers partiellement copiés?

P.S. 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 plutôt.

54
Bohdan

Vous devriez utiliser rsync sur ssh

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

L'option de clé est -P, identique à --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

90
jordi

Une alternative à rsync:

Utilisez sftp avec l'option -r (copier récursivement des répertoires entiers) et l'option -a de la commande sftp's get pour reprendre les transferts partiels de fichiers existants. 

Prérequis: Votre implémentation sftp a déjà une option get avec -a.

Exemple:

Copiez le répertoire /foo/bar du serveur distant dans votre répertoire actuel local. Le répertoire bar sera créé dans votre répertoire local Current.

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

Depuis OpenSSH 6.3, vous pouvez utiliser reget commande in sftp.

Sa syntaxe est identique à celle de la variable get, à la différence près qu'il commence un transfert à partir de la fin d'un fichier local existant.

6
Martin Prikryl

Une autre possibilité consiste à essayer de récupérer le SCP que vous avez déjà démarré quand il est bloqué.

ctrl + z pour mettre en arrière-plan et l'arrêter, puis ssh sur le serveur de réception et se connecter, puis quitte. Maintenant, arrêtez le processus scp et regardez-le reprendre son cours!

3
Puckfist

Lorsque rsync s'arrête également après quelques secondes, alors que tout fonctionnait bien, je me suis retrouvé 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 -rsh et -P de rsync. -P est destiné au téléchargement partiel et -rsh indique que le transfert a lieu sur ssh procotol.

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

0
Bunny Rabbit