Cómo automatizar la comparación de valores hash md5sum para una gran cantidad de archivos

28

Puedo verificar el hash md5sum de un archivo desde una terminal como,

$ md5sum my_sensitive_file
8dad53cfc973c59864b8318263737462 my_sensitive_file

Pero la parte difícil es comparar el valor hash con uno exacto.

Es difícil comparar la salida de 32 caracteres con el valor hash original / exacto por cualquier humano para una gran cantidad de archivos. En primer lugar, el trabajo sería muy monótono y hay una gran variedad de errores.

¿Es posible automatizar el proceso de comparación, preferiblemente en CLI?

souravc
fuente

Respuestas:

39

Por ejemplo, tengo un archivo llamado test_binary.

La prueba de suma de archivos MD5 es ef7ab26f9a3b2cbd35aa3e7e69aad86c

Para probarlo, ejecuta esto automáticamente:

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

o

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

Cita del hombre

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

Cita de wiki

Nota: Debe haber dos espacios entre cada valor md5sum y nombre de archivo para comparar. De lo contrario, se producirá el siguiente error: "no se encontraron líneas de suma de comprobación MD5 formateadas correctamente".

Enlace a wiki

También puedes leer hash md5 del archivo

$ md5sum -c md5sum_formatted_file.txt

Está esperando un archivo con formato:

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

Acerca *y <space>después del hash de suma MD5. Hay poca nota en el hombre:

 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.

Y aquí hay un enlace a stackoverflow donde encontré la respuesta a la pregunta, ¿por qué deberíamos, a veces, distinguir binaryarchivos y textarchivos?


c0rp
fuente
3
¿Es necesario el asterisco?
jobin
Interesante pregunta. Siempre uso con *, pero wiki dijo que debería ser dos espacios.
Buscaré
@souravc ok, encontré información sobre *, se actualizará pronto
c0rp
@Jobin Añado información *para responder
c0rp
Eso tiene sentido. +1
jobin
2

Una posibilidad es usar la utilidad cfv

sudo apt-get install cfv

CFV admite muchos tipos de hash, y tanto la creación de pruebas como la creación de archivos hash.

# 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
Elliott Frisch
fuente
1
gracias por su respuesta, pero necesita instalar otra utilidad. Al mismo tiempo, también proporciona soporte para otro formato. Es bueno saberlo. Pero en el contexto actual iré con la otra respuesta. De todos modos +1 de mi parte.
souravc
1

Sí, *se requiere un asterisco para este comando. Echale un vistazo a éste ejemplo.

Este es el archivo binario, y digamos que el valor correcto de md5sum es exampleofcorrectmd5value00000000(32 caracteres hexadecimales)

[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

lea las sumas de MD5 de los ARCHIVOS y verifíquelas

Si el valor de md5sum coincide con el archivo binario, obtendrá esta salida

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

Y esto es cuando el valor md5sum no coincide

[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]# 

Sin asterisco *, obtendrá el siguiente mensaje de error, incluso si el valor md5 es correcto

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

Además, recibirá el mismo mensaje de error si md5sum no tiene 32 caracteres hexadecimales. En este ejemplo, solo tiene 31 caracteres.

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

Solución para muchos archivos

Si tiene muchos archivos y desea automatizar el proceso, puede seguir estos pasos:

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:~$ 

Genere md5sum para cada archivo y guárdelo en md5sum.txt

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

Para verificar md5sum para todos los archivos, use el siguiente comando.

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

Este es un ejemplo si el valor de md5sum no coincide con el archivo. En este caso, voy a modificar el file-bcontenido.

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

Mira, este es el mensaje de error. Espero que esto ayude.

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:~$ 
Charlotte Russell
fuente