Dois-je vérifier la corruption du file une fois que scp est fait?

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 , scp ne garantit pas l'intégrité du file (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 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