J'ai recursivement transféré de nombreux files et dossiers avec scp
, en utilisant la command:
scp -rp /source/folder [email protected]:/destination/folder
Une fois le transfert terminé, dois-je vérifier si tous les files ont été transférés sans corruption ou si scp
s'en occupe (c.-à-d. Affiche un message d'erreur si l'un des files n'est pas correctement transféré)?
scp
vérifie qu'il a copié toutes datatables envoyées par l'autre partie. L'intégrité du transfert est garantie par le protocole du canal cryptographique. Vous n'avez donc pas besoin de vérifier l'intégrité après le transfert. Ce serait redondant, et très peu probable d'attraper une erreur matérielle puisque datatables que vous comparez seront probablement lues à partir du cache. Vérifier datatables périodiquement peut être utile, mais vérifier immédiatement après le transfert est inutile.
Vous devez cependant vous assurer que scp
ne vous dit pas que quelque chose s'est mal passé. Il devrait y avoir un message d'erreur, mais l'indicateur fiable est que scp
renvoie un code de sortie différent de zéro en cas de problème.
Plus précisément, vous savez que le file a été transmis correctement si scp
renvoie 0 (c'est-à-dire le code de succès). Vérifier que le statut de sortie est 0 est nécessaire lorsque vous exécutez une command de toute façon. Si scp
renvoie un état d'erreur ou s'il est tué par un signal ou s'il ne meurt jamais parce que le système se bloque ou perd de l'alimentation lorsqu'il est en cours d'exécution, vous n'avez aucune garantie. En particulier, puisque scp
copy le file directement dans son nom final, cela signifie que vous pouvez vous refind avec un file partiel en cas de plantage du système. La partie qui a été copiée est garantie d'être correcte mais le file peut être tronqué.
Pour une meilleure fiabilité, utilisez rsync au lieu de scp. Sauf indication contraire, rsync écrit dans un file temporaire et le remet en place une fois qu'il est terminé. Ainsi, si rsync renvoie un code de réussite, vous savez que le file est présent et une copy correcte et complète; si rsync n'a pas renvoyé de code d'erreur, aucun file ne sera présent (sauf s'il y a une ancienne version du file, auquel cas cette ancienne version ne sera pas modifiée).
Je n'ai jamais eu de problème avec la corruption après avoir scp
quelque chose, mais si vous êtes inquiet, vous pouvez toujours exécuter md5sum <filename>
sur les deux systèmes pour vous assurer qu'ils sont identiques.
La suggestion de Per @ david-king, c'est une solution basée sur md5
pour vérifier l'intégrité des files après le transfert. Exécutez la command suivante une fois après avoir cd
dans /source/folder
sur la machine locale et une fois après avoir cd
file /destination/folder
sur l'hôte distant: find . -type f -print0 | xargs -0 -I {} md5sum {} | md5sum
find . -type f -print0 | xargs -0 -I {} md5sum {} | md5sum
find . -type f -print0 | xargs -0 -I {} md5sum {} | md5sum
. Le hachage résultant doit être identique après un transfert réussi.
Mettre à jour: Selon cette réponse à une question similaire sur ServerFault , (Veuillez vérifier cette réponse par @ Gilles pour plus de détails). Alternative à la vérification post-transfert des hachages de files, vous pouvez utiliser scp
ne garantit pas l'intégrité du file rsync
pour transférer des files et vérifier son code de return.
Mise à jour 2: La suivante vérifie uniquement si les files et leurs tailles respectives correspondent après le transfert: find . -type f -print0 | xargs -0 -I {} stat --printf="%n %s\n" {} | sort | md5sum
find . -type f -print0 | xargs -0 -I {} stat --printf="%n %s\n" {} | sort | md5sum