¡Descarga las sumas de verificación md5 y sha1 con un solo comando!

9

Estoy buscando comandos o utilidades para calcular md5 , sha1 hash value por un comando.
En este momento Ubuntu tiene sha1sumy md5sumcomandos para el cálculo de hashvalor.

MS Parmar
fuente
2
Porqué lo quieres? Por lo general, desea poder verificar hashes después de generarlos. Por ejemplo, para generar un hash: md5sum hosts. Entonces, para verificar este resultado: echo "b9adfb2e2022a3a84ba06b55eeb2dc64 hosts" | md5sum --check(debe dar: hosts: OK)
Lekensteyn
2
supongamos que si desea calcular el 'valor hash' de un disco duro de 500 GB, es decir, sha1 y md5. Si calculo uno por uno (usando sha1sum y md5sum) tomaría el doble de tiempo. pero si pudiera hacerse con utilidades únicas iguales al software de Windows, entonces sería mi respuesta deseada.
MS Parmar

Respuestas:

9

Puede lograr esto con algunos bash ninja-fu adecuados. :)

Conoces el procedimiento para calcular uno a la vez:

$ echo abc | md5sum
0bee89b07a248e27c83fc3d5951213c1  -
$ echo abc | sha1sum
03cfd743661f07975fa2f1220c5194cbaff48451  -

Editar: como sugirió @gertvdijk, y leer un poco más las páginas de información, esto se puede hacer directamente con tee y Process Substitution respaldados por shells modernos, sin redireccionamientos. De esta manera, puede pasar sus datos a dos procesos y un archivo usando tee:

$ echo abc | tee >(md5sum) >(sha1sum) > output.txt

También es posible encadenar si necesita más, pero debe cuidar STDOUT de todos los subprocesos. Esto NO le dará el resultado esperado, pero mezcla las dos primeras sumas de verificación junto con los datos en output.txt:

$ echo abc | tee >(md5sum) >(sha1sum) | tee >(sha256sum) >(sha512sum) > output.txt

Si redirige las sumas de verificación a un archivo dentro de los procesos sustituidos, puede encadenarlas como desee:

$ echo abc | tee >(md5sum > /tmp/md5.txt) >(sha1sum > /tmp/sha1.txt) | tee >(sha256sum > /tmp/sha256.txt) >(sha512sum > /tmp/sha512.txt) > output.txt

Aquí está mi sugerencia inicial sin sustitución del proceso, pero que permite el uso encadenado / recursivo sin mezclar los datos y la salida:

$ echo abc | tee -a /proc/self/fd/2 2> >(sha1sum) > >(md5sum)
0bee89b07a248e27c83fc3d5951213c1  -
03cfd743661f07975fa2f1220c5194cbaff48451  -

El truco aquí es usar tee, que duplica los datos a STDOUT y un archivo. Estamos siendo inteligentes diciéndole que escriba los datos en el archivo / proc / self / fd / 2, que siempre es el descriptor de archivo STDERR del proceso actual. Y con la > >(program)sintaxis podemos redirigir cada descriptor de archivo al STDIN de un programa en lugar de un archivo. Al igual que |, pero con más control. > >(md5sum)redirige STDOUT al md5sumprograma, mientras que 2> >(sha1sum)redirige STDERR al sha1sumprograma.

Tenga en cuenta que el orden de 2>y >parece importar, tengo que poner 2>primero en la línea de comando. Estos se evalúan de derecha a izquierda, pero no estoy seguro de por qué esto hace la diferencia.

Para hacer esto en un archivo o disco duro, debe reemplazar "echo abc" con un gato o un dd, por ejemplo:

dd if=/dev/sda bs=8k | tee -a /proc/self/fd/2 2> >(sha1sum) > >(md5sum)

Lo ingenioso de esto es que en realidad puede recurrir y ejecutar varios al mismo tiempo, no solo dos. La sintaxis se vuelve peluda, pero esto funciona:

echo abc | tee -a /proc/self/fd/2 2> >(tee -a /proc/self/fd/2 2> >(sha256sum) > >(sha384sum) ) > >(sha512sum)

Si desea capturar el resultado y usarlo en un script, eso también funciona:

A=$(echo abc | tee -a /proc/self/fd/2 2> >(sha1sum) > >(md5sum))

Ahora $Aes una cadena que contiene toda la salida, incluidas las nuevas líneas. También puede analizar los valores más adelante:

echo "checksum=[$(echo "$A" | head -1 | cut -d " " -f 1)]"

Sin embargo, no estoy seguro de que tenga garantías con respecto al pedido de la salida.

ketil
fuente
2
+1. teey el uso inteligente de la redirección de salida en el shell es el camino a seguir. Esto ahorra muchos recursos, especialmente al leer archivos grandes.
gertvdijk
2
Por cierto, creo que no es necesario redirigir a stderr para duplicar la salida de la transmisión. El uso de una subshell también hará el truco, manteniendo stderr. Vea mi ejemplo aquí en una publicación de blog .
gertvdijk
@gertvdijk Correcto, la sustitución del proceso es más limpia y más fácil de encadenar (no es necesario recurrir). Actualizaré mi respuesta.
ketil
Agradable. Te daría otro voto positivo si pudiera. :-)
gertvdijk
Si bien estos funcionan bien para archivos pequeños agradables, está duplicando los esfuerzos y el tiempo de procesamiento para archivos más grandes que estoy tratando de evitar ...
EkriirkE
3

No puedo ayudarte con la línea de comandos, pero conozco una herramienta GUI llamada quickhash.

Puede descargar esa herramienta desde Quickhash

Descripción:

Una GUI de Linux y Windows para permitir la selección rápida y el posterior hash de archivos (individual o recursivamente a través de una estructura de carpetas) de texto y (en Linux) discos. Diseñado para Linux, pero también disponible para Windows. MD5, SHA1, SHA256, SHA512 disponibles. Salida copiada al portapapeles o guardada como archivo CSV \ HTML.

rɑːdʒɑ
fuente
0
Here i have find one python script from source which calculate hash values. and also i find some statistics about hash value calculation.

 - `md5sum` takes 00:3:00 min to calculate 4GB USB.
 - `sha2sum` takes 00:3:01 min to calculate 4GB USB.
 - While phython script takes 3:16 min to calculate both MD5 and SHA1.

// El script comienza desde aquí

def get_custom_checksum(input_file_name):
    from datetime import datetime
    starttime = datetime.now()
    # START: Actual checksum calculation
    from hashlib import md5, sha1, sha224, sha384, sha256, sha512
    #chunk_size = 1 # 1 byte -- NOT RECOMENDED -- USE AT LEAST 1KB. When 1KB takes 1 min to run, 1B takes 19 minutes to run
    #chunk_size = 1024 # 1 KB
    chunk_size = 1048576 # 1024 B * 1024 B = 1048576 B = 1 MB
    file_md5_checksum = md5()
    file_sha1_checksum = sha1()

    try:
        with open(input_file_name, "rb") as f:
            byte = f.read(chunk_size)
            previous_byte = byte
            byte_size = len(byte)
            file_read_iterations = 1
            while byte:
                file_md5_checksum.update(byte)
                file_sha1_checksum.update(byte)               
                previous_byte = byte
                byte = f.read(chunk_size)
                byte_size += len(byte)
                file_read_iterations += 1
    except IOError:
        print ('File could not be opened: %s' % (input_file_name))
        #exit()
        return
    except:
        raise
    # END: Actual checksum calculation
    # For storage purposes, 1024 bytes = 1 kilobyte
    # For data transfer purposes, 1000 bits = 1 kilobit
    kilo_byte_size = byte_size/1024
    mega_byte_size = kilo_byte_size/1024
    giga_byte_size = mega_byte_size/1024
    bit_size = byte_size*8
    kilo_bit_size = bit_size/1000
    mega_bit_size = kilo_bit_size/1000
    giga_bit_size = mega_bit_size/1000
    last_chunk_size = len(previous_byte)
    stoptime = datetime.now()
    processtime = stoptime-starttime
    custom_checksum_profile = {
        'starttime': starttime,
        'byte_size': byte_size,
        'kilo_byte_size': kilo_byte_size,
        'mega_byte_size': mega_byte_size,
        'giga_byte_size': giga_byte_size,
        'bit_size': bit_size,
        'kilo_bit_size': kilo_bit_size,
        'mega_bit_size': mega_bit_size,
        'giga_bit_size': giga_bit_size,
        'file_read_iterations': file_read_iterations,
        'last_chunk_size': last_chunk_size,
        'md5_checksum': file_md5_checksum.hexdigest(),
        'sha1_checksum': file_sha1_checksum.hexdigest(),        
        'stoptime': stoptime,
        'processtime': processtime,
        }
    return custom_checksum_profile



def print_custom_checksum(input_file_name):
    custom_checksum_profile = get_custom_checksum(input_file_name)
    try:
        print 'Start Time ::', custom_checksum_profile['starttime']

custom_checksum_profile ['file_read_iterations']) # print ('Last Chunk (bytes):', custom_checksum_profile ['last_chunk_size']) print 'MD5 ::', custom_checksum_profile ['md5_checksum'] print 'SHA1 ::', custom_checksum_1ofile [ '] print' Stop Time :: ', custom_checksum_profile [' stoptime '] print' Processing Time :: ', custom_checksum_profile [' processtime '] excepto TypeError: # El objeto' NoneType 'no es subscriptable --- básicamente esto debería suceder cuando el el archivo de entrada no se pudo abrir #raise pass # csv output

import argparse
script_version='0.0.2'
parser = argparse.ArgumentParser(description='Determine and print various checksums of an input file and its size. Supported checksums are MD5, SHA1, SHA224, SHA256, SHA384, and SHA512.', version=script_version)
parser.add_argument('-f', '--file', metavar='in-file', action='store', dest='file_name', type=str, required=True, help='Name of file for which the checksum needs to be calculated')
args = parser.parse_args()
print 'Processing File ::', args.file_name
print_custom_checksum(args.file_name)
MS Parmar
fuente