Dump md5 und sha1 Prüfsummen mit einem einzigen Befehl!


9

Ich suche nach Befehlen oder Dienstprogrammen zum Berechnen des md5 , sha1-Hashwerts mit einem Befehl.
Gerade jetzt ubuntu hat sha1sumund md5sumBefehl zur Berechnung hashWert.


2
Warum willst du das? Normalerweise möchten Sie Hashes nach dem Generieren überprüfen können. Zum Beispiel, um einen Hash zu generieren : md5sum hosts. Dann dieses Ergebnis zu überprüfen: echo "b9adfb2e2022a3a84ba06b55eeb2dc64 hosts" | md5sum --check(geben sollte: hosts: OK)
Lekensteyn

2
Angenommen, Sie möchten den Hash-Wert einer 500-GB-Festplatte berechnen, dh sowohl sha1 als auch md5. Wenn ich eins nach dem anderen berechne (mit sha1sum und md5sum), würde das doppelt so lange dauern. Aber wenn dies mit einzelnen Dienstprogrammen wie Windows-Software möglich wäre, wäre dies meine gewünschte Antwort.
MS Parmar

Antworten:


9

Sie können dies mit einem richtigen Bash Ninja-Fu erreichen. :) :)

Sie kennen das Verfahren zur Berechnung nacheinander:

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

Bearbeiten: Wie @gertvdijk vorgeschlagen hat und die Infoseiten etwas genauer gelesen werden, kann dies direkt mit Tee und Process Substitution erfolgen, die von modernen Shells unterstützt werden, ohne Weiterleitungen. Auf diese Weise können Sie Ihre Daten mit tee an zwei Prozesse und eine Datei übergeben:

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

Es ist auch möglich, zu verketten, wenn Sie mehr benötigen, aber Sie müssen sich um STDOUT aus allen Unterprozessen kümmern. Dies gibt Ihnen NICHT das erwartete Ergebnis, sondern mischt die ersten beiden Prüfsummen mit den Daten in output.txt:

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

Wenn Sie die Prüfsummen in eine Datei innerhalb der ersetzten Prozesse umleiten, können Sie diese nach Belieben verketten:

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

Hier ist mein erster Vorschlag ohne Prozessersetzung, der jedoch eine Verkettung / rekursive Verwendung ermöglicht, ohne die Daten und die Ausgabe zu mischen:

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

Der Trick hierbei ist die Verwendung tee, die die Daten in STDOUT und eine Datei dupliziert. Wir sind schlau, indem wir ihm sagen, dass er die Daten in die Datei / proc / self / fd / 2 schreiben soll, die zufällig immer der STDERR-Dateideskriptor des aktuellen Prozesses ist. Und mit der > >(program)Syntax können wir jeden Dateideskriptor auf die STDIN eines Programms anstatt auf eine Datei umleiten. Genau wie |, aber mit mehr Kontrolle. > >(md5sum)leitet STDOUT zum md5sumProgramm um, während 2> >(sha1sum)STDERR zum sha1sumProgramm umgeleitet wird .

Beachten Sie, dass die Reihenfolge 2>und >wichtig zu sein scheint, ich muss 2>zuerst in die Befehlszeile setzen. Diese werden von rechts nach links ausgewertet, aber ich bin mir nicht sicher, warum dies einen Unterschied macht.

Um dies auf einer Datei oder einer Festplatte zu tun, sollten Sie "echo abc" durch eine Katze oder eine dd ersetzen, z.

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

Das Schöne daran ist, dass Sie tatsächlich mehrere gleichzeitig rekursieren und ausführen können, nicht nur zwei. Die Syntax wird haarig, aber das funktioniert:

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

Wenn Sie das Ergebnis erfassen und in einem Skript verwenden möchten, funktioniert dies auch:

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

Jetzt $Aist eine Zeichenfolge, die die gesamte Ausgabe einschließlich der Zeilenumbrüche enthält. Sie können die Werte auch später analysieren:

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

Ich bin mir jedoch nicht sicher, ob Sie Garantien für die Bestellung der Ausgabe haben.


2
+1. teeDie clevere Verwendung der Ausgabeumleitung in der Shell ist der richtige Weg. Dies spart viele Ressourcen, insbesondere beim Lesen großer Dateien.
Gertvdijk

2
Ich denke übrigens, Sie müssen nicht zu stderr umleiten, um die Ausgabe des Streams zu duplizieren. Die Verwendung einer Subshell reicht ebenfalls aus, um stderr beizubehalten. Siehe mein Beispiel hier in einem Blog-Beitrag .
Gertvdijk

@gertvdijk Richtig, die Prozessersetzung ist sauberer und einfacher zu verketten (Sie müssen nicht rekursieren). Ich werde meine Antwort aktualisieren.
Ketil

Nett. Ich würde dir noch eine Gegenstimme geben, wenn ich könnte. :-)
gertvdijk

Während diese für nette kleine Dateien gut funktionieren, verdoppeln Sie den Aufwand und die Verarbeitungszeit für größere Dateien, die ich vermeiden
möchte

3

Ich kann Ihnen nicht mit der Befehlszeile helfen, aber ich kenne ein GUI-Tool namens Quickhash.

Sie können dieses Tool von Quickhash herunterladen

Beschreibung:

Eine Linux- und Windows-GUI zum schnellen Auswählen und anschließenden Hashing von Textdateien (einzeln oder rekursiv in einer Ordnerstruktur) und (unter Linux) Datenträgern. Entwickelt für Linux, aber auch für Windows verfügbar. MD5, SHA1, SHA256, SHA512 erhältlich. Ausgabe in die Zwischenablage kopiert oder als CSV \ HTML-Datei gespeichert.


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.

// Skript beginnt hier

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 ('Letzter Block (Bytes):', custom_checksum_profile ['last_chunk_size']) print 'MD5 ::', custom_checksum_profile ['md5_checksum'] print 'SHA1 ::', custom_checksum_1 '] print' Stop Time :: ', custom_checksum_profile [' stoptime '] print' Verarbeitungszeit :: ', custom_checksum_profile [' processtime '] außer TypeError: #' NoneType 'Objekt ist nicht abonnierbar --- im Grunde sollte dies passieren, wenn das Eingabedatei konnte nicht geöffnet werden #raise pass # csv Ausgabe

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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.