Dois-je vérifier la corruption des fichiers une fois que scp est terminé?

17

J'ai transféré récursivement de nombreux fichiers et dossiers avec scp, à l'aide de la commande:

scp -rp /source/folder [email protected]:/destination/folder

Une fois le transfert terminé, dois-je vérifier si tous les fichiers ont été transférés sans aucune corruption, ou en scpprend soin (c'est-à-dire affiche un message d'erreur si l'un des fichiers n'est pas correctement transféré)?

Franck Dernoncourt
la source
À moins que vous n'obteniez un état de sortie différent de zéro scpet un message d'erreur qui l'accompagne à stderr , il aura tout copié correctement et complètement.
roaima
un peu tl; dr à mon poste: utilisez rsyncsi vous le pouvez. Il copie les validations pour chaque fichier après la fin d'une transaction, c'est donc une bonne idée de l'utiliser pour être un peu plus sûr.
polemon

Réponses:

24

scpvérifie qu'il a copié toutes les données envoyées par l'autre partie. L'intégrité du transfert est garantie par le protocole de 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 susceptible de détecter une erreur matérielle, car les données que vous comparez seraient probablement lues dans le cache. La vérification périodique des données peut être utile, mais la vérification immédiatement après le transfert est inutile.

Vous devez cependant vous assurer que cela scpne vous dit pas que quelque chose s'est mal passé. Il devrait y avoir un message d'erreur, mais l'indicateur fiable est qu'il scprenvoie un code de sortie différent de zéro en cas de problème.

Plus précisément, vous savez que le fichier a été transmis correctement s'il scprenvoie 0 (c'est-à-dire le code d'état de réussite). Il est nécessaire de vérifier que l'état de sortie est 0 lorsque vous exécutez une commande de toute façon. Si scprenvoie 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 la puissance pendant son fonctionnement, alors vous n'avez aucune garantie. En particulier, puisque scpcopie le fichier directement dans son nom final, cela signifie que vous pouvez vous retrouver avec un fichier partiel en cas de panne du système. La partie copiée est garantie correcte mais le fichier peut être tronqué.

Pour une meilleure fiabilité, utilisez rsync au lieu de scp. Sauf indication contraire, rsync écrit dans un fichier temporaire et le met en place une fois qu'il est terminé. Ainsi, si rsync renvoie un code de réussite, vous savez que le fichier est présent et une copie correcte et complète; si rsync n'a pas renvoyé de code d'erreur, aucun fichier ne sera présent (sauf s'il y avait une ancienne version du fichier, auquel cas cette ancienne version ne sera pas modifiée).

Gilles 'SO- arrête d'être méchant'
la source
3

Je n'ai jamais eu de problème de corruption après scpquelque chose, mais si cela vous inquiète, vous pouvez toujours exécuter md5sum <filename>les deux systèmes pour vous assurer qu'ils sont identiques.

David King
la source
3

Selon la suggestion de @ david-king, il s'agit d'une md5solution basée sur la vérification de l'intégrité des fichiers après le transfert. Exécutez la commande suivante une fois après cdING /source/foldersur la machine locale et une fois après cdING /destination/foldersur l'hôte distant: find . -type f -print0 | xargs -0 -I {} md5sum {} | md5sum. Le hachage résultant doit être identique après un transfert réussi.

Mise à jour: Selon cette réponse à une question similaire sur ServerFault , scpne garantit pas l'intégrité des fichiers(Veuillez vérifier cette réponse par @Gilles pour plus de détails). Alternative à la vérification post-transfert des hachages de fichiers, vous pouvez utiliser rsyncpour transférer des fichiers et vérifier son code retour.

Mise à jour 2: les éléments suivants vérifient uniquement si les fichiers et leurs tailles respectives correspondent après le transfert:find . -type f -print0 | xargs -0 -I {} stat --printf="%n %s\n" {} | sort | md5sum

Mani M
la source
2
Si scp renvoie 0, alors l'intégrité est garantie. De plus, si scp ne renvoie pas 0, le problème n'est pas la corruption générique mais spécifiquement la troncature; la vérification de la taille du fichier est suffisante (sauf s'il existait déjà une ancienne version du fichier cible: si scp a été interrompu très tôt, alors l'ancienne version peut toujours être présente). Vérifier les sommes de contrôle ici est une perte de temps.
Gilles 'SO- arrête d'être méchant'
Juste. J'ai mis à jour ma réponse.
Mani M
Vous n'avez pas corrigé la faille fondamentale. La vérification scpdu code de retour suffit et la vérification des hachages est inutile.
Gilles 'SO- arrête d'être méchant'
1
Même si les scprendements 0 , il ne garantit pas que le système de fichiers n'a pas sali les choses, afin de vérifier les hash est toujours utile pour vérifier l'intégrité des données sensibles si quelqu'un choisissent d'utiliser scpplus rsync.
Mani M