web-dev-qa-db-fra.com

Comment automatiser la comparaison des valeurs de hachage md5sum pour un grand nombre de fichiers

Je peux vérifier le hash md5sum d'un fichier depuis un terminal,

$ md5sum my_sensitive_file
8dad53cfc973c59864b8318263737462 my_sensitive_file

Mais la partie difficile est de comparer la valeur de hachage avec la valeur exacte.

Il est difficile de comparer la sortie de 32 caractères avec la valeur de hachage originale/exacte par un humain pour un grand nombre de fichiers. Tout d'abord, le travail serait très monotone et il y aurait une grande quantité d'erreurs.

Est-il possible d'automatiser le processus de comparaison, de préférence en CLI?

26
souravc

Par exemple, j'ai un fichier appelé test_binary.

La somme MD5 du test de fichier est ef7ab26f9a3b2cbd35aa3e7e69aad86c

Pour le tester, lancez automatiquement ceci:

$ md5sum -c <<<"ef7ab26f9a3b2cbd35aa3e7e69aad86c *path/to/file/test_binary"
test_binary: OK

ou

$ echo "595f44fec1e92a71d3e9e77456ba80d1  filetohashA.txt" | md5sum -c -

Citation de l'homme

   -c, --check
          read MD5 sums from the FILEs and check them

Citation de wiki

Remarque: Il doit y avoir deux espaces entre chaque valeur md5sum et le nom du fichier à comparer. Sinon, l’erreur suivante sera générée: "Aucune ligne de somme de contrôle MD5 correctement formatée n’a été trouvée".

Lien vers le wiki

Aussi, vous pouvez simplement lire les hachages md5 du fichier

$ md5sum -c md5sum_formatted_file.txt

Il attend un fichier au format:

<md5sum_checksum><space><space><file_name>

À propos de * et <space> après le hash sum MD5. Il y a peu de note chez l'homme:

 When  checking,  the
       input  should  be a former output of this program.  The default mode is
       to print a line with checksum, a character indicating input  mode  ('*'
       for binary, space for text), and name for each FILE.

Et voici le lien vers stackoverflow où j'ai trouvé la réponse à la question. Pourquoi devrions-nous parfois distinguer les fichiers binary et les fichiers text?.


37
c0rp

Une possibilité consiste à utiliser l'utilitaire cfv

Sudo apt-get install cfv

CFV prend en charge de nombreux types de hachages, ainsi que les tests et la création de fichiers de hachage.

# List the files
$ ls
test.c
# Create a hash file
$ cfv -tmd5 -C
temp.md5: 1 files, 1 OK.  0.001 seconds, 302.7K/s
# Test the hash file
$ cfv -tmd5 -T
temp.md5: 1 files, 1 OK.  0.001 seconds, 345.1K/s
# Display the hash file
$ cat *.md5
636564b0b10b153219d6e0dfa917d1e3 *test.c
2
Elliott Frisch

Oui, un astérisque * est requis pour cette commande. Jetez un oeil à cet exemple.

Ceci est le fichier binaire, et disons que la valeur correcte de md5sum est exampleofcorrectmd5value00000000 (32 caractères hexadécimaux)

[root@Linux update]# ls -lh
total 137M
-rw-r--r-- 1 root root 137M Nov  5 13:01 binary-file.run.tgz
[root@Linux update]# 

-c, --check

lire les sommes MD5 à partir des FICHIERS et les vérifier

Si la valeur md5 correspond au fichier binaire, vous obtiendrez cette sortie

[root@Linux ~]# md5sum -c <<< "exampleofcorrectmd5value00000000" *binary-file.run.tgz"
binary-file.run.tgz: OK
[root@Linux ~]# 

Et c’est à ce moment que la valeur md5sum ne correspond pas

[root@Linux update]# md5sum -c <<< "exampleofwrongmd5value0000000000 *binary-file.run.tgz"
binary-file.run.tgz: FAILED
md5sum: WARNING: 1 of 1 computed checksum did NOT match
[root@Linux update]# 

Sans astérisque *, vous obtiendrez le message d'erreur suivant même si la valeur md5 est correcte

[root@Linux ~]# md5sum -c <<< "exampleofcorrectmd5value00000000 binary-file.run.tgz" 
md5sum: standard input: no properly formatted MD5 checksum lines found
[root@Linux ~]# 

De plus, vous recevrez le même message d'erreur si md5sum ne contient pas 32 caractères hexadécimaux. Dans cet exemple, il ne comporte que 31 caractères.

[root@Linux ~]# md5sum -c <<< "exampleofmd5valuelessthan32char *binary-file.run.tgz" 
md5sum: standard input: no properly formatted MD5 checksum lines found
[root@Linux ~]# 

Solution pour beaucoup de fichiers

Si vous avez plusieurs fichiers et souhaitez automatiser le processus, procédez comme suit:

user@Ubuntu:~$ ls -lh
total 12K
-rw-rw-r-- 1 user user 4 Nov  5 14:54 file-a
-rw-rw-r-- 1 user user 4 Nov  5 14:54 file-b
-rw-rw-r-- 1 user user 4 Nov  5 14:54 file-c
user@Ubuntu:~$ 

Générez md5sum pour chaque fichier et enregistrez-le dans md5sum.txt

user@Ubuntu:~$ md5sum * | tee md5sum.txt
0bee89b07a24ae27c83fc3d5951213c1  file-a
1b2297c171a9a450d184871ccf6c9ad4  file-b
7f4d13d9b0b6ac086fd68637067435c5  file-c
user@Ubuntu:~$ 

Pour vérifier md5 pour tous les fichiers, utilisez la commande suivante.

user@Ubuntu:~$ md5sum -c md5sum.txt 
file-a: OK
file-b: OK
file-c: OK
user@Ubuntu:~$ 

Ceci est un exemple si la valeur md5sum ne correspond pas au fichier. Dans ce cas, je vais modifier le contenu de file-b

user@Ubuntu:~$ echo "new data" > file-b 
user@Ubuntu:~$ 

Voir, c'est le message d'erreur. J'espère que cela t'aides.

user@Ubuntu:~$ md5sum -c md5sum.txt 
file-a: OK
file-b: FAILED
file-c: OK
md5sum: WARNING: 1 computed checksum did NOT match
user@Ubuntu:~$ 
1