web-dev-qa-db-fra.com

Dump md5 et sha1 checksums avec une seule commande!

Je cherche une commande ou des utilitaires pour calculer md5, sha1 hacha valeur par une commande.
Actuellement, Ubuntu a sha1sum et md5sum commande de calcul de la valeur hash.

8
M S Parmar

Vous pouvez y parvenir avec un bon ninja-fu bash. :)

Vous connaissez la procédure pour calculer un à la fois:

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

Edit: comme @gertvdijk l’a suggéré, et en lisant un peu plus les pages d’information, cela peut être fait directement avec tee et Process Substitution supportés par des shells modernes, sans redirections. De cette façon, vous pouvez transmettre vos données à deux processus et à un fichier en utilisant tee:

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

Il est également possible de chaîner si vous avez besoin de plus, mais vous devez vous occuper de STDOUT de tous les sous-processus. Cela ne vous donnera PAS le résultat attendu, mais mélange les deux premières sommes de contrôle avec les données du fichier output.txt:

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

Si vous redirigez les sommes de contrôle vers un fichier à l'intérieur des processus substitués, vous pouvez les chaîner comme vous le souhaitez:

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

Voici ma suggestion initiale sans substitution de processus, mais qui permet une utilisation en chaîne/récursive sans mélanger les données et la sortie:

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

L'astuce consiste ici à utiliser tee, qui duplique les données dans STDOUT et dans un fichier. Nous sommes intelligents en lui disant d'écrire les données dans le fichier/proc/self/fd/2, qui est toujours le descripteur de fichier STDERR du processus actuel. Et avec la syntaxe > >(program), nous pouvons rediriger chaque descripteur de fichier vers le STDIN d'un programme au lieu d'un fichier. Tout comme |, mais avec plus de contrôle. > >(md5sum) redirige STDOUT vers le programme md5sum, tandis que 2> >(sha1sum) redirige STDERR vers le programme sha1sum.

Notez que l'ordre de 2> et > semble avoir de l'importance, je dois donc mettre 2> en premier sur la ligne de commande. Celles-ci sont évaluées de droite à gauche, mais je ne sais pas pourquoi cela fait une différence.

Pour ce faire sur un fichier ou un disque dur, vous devez remplacer "echo abc" par un chat ou un dd, par exemple:

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

La chose intéressante à ce sujet est que vous pouvez réellement recurse et exécuter plusieurs à la fois, pas seulement deux. La syntaxe devient poilue, mais cela fonctionne:

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

Si vous voulez capturer le résultat et l'utiliser dans un script, cela fonctionne aussi:

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

Maintenant, $A est une chaîne contenant toute la sortie, y compris les nouvelles lignes. Vous pouvez analyser les valeurs plus tard aussi:

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

Je ne suis pas sûr que vous ayez la moindre garantie quant à la commande de la sortie.

8
ketil

Je ne peux pas vous aider avec la ligne de commande, mais je connais un outil graphique nommé quickhash.

Vous pouvez télécharger cet outil depuis Quickhash

La description:

Une interface graphique Linux et Windows permettant la sélection rapide et le hachage ultérieur des fichiers (individuellement ou de manière récursive dans une structure de dossiers) du texte et des disques (sous Linux). Conçu pour Linux, mais également disponible pour Windows. MD5, SHA1, SHA256, SHA512 disponibles. La sortie copiée dans le Presse-papiers ou enregistrée en tant que fichier CSV\HTML.

3
rɑːdʒɑ
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.

// le script commence à partir d'ici

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 'bricolage et des recherches sur les produits de qualité '] print' Stop Time :: ', custom_checksum_profile [' stoptime '] print' Temps de traitement :: ', custom_checksum_profile [' processtime '] sauf TypeError: # L'objet' NoneType 'n'est pas souscriptable - cela devrait se produire lorsque l'essentiel le fichier d'entrée n'a pas pu être ouvert # passe passe # sortie csv

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)
0
M S Parmar