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.
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.
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
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.
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!
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
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