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.
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:
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:
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:
+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.
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.
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)
md5sum hosts
. Dann dieses Ergebnis zu überprüfen:echo "b9adfb2e2022a3a84ba06b55eeb2dc64 hosts" | md5sum --check
(geben sollte:hosts: OK
)Antworten:
Sie können dies mit einem richtigen Bash Ninja-Fu erreichen. :) :)
Sie kennen das Verfahren zur Berechnung nacheinander:
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:
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:
Wenn Sie die Prüfsummen in eine Datei innerhalb der ersetzten Prozesse umleiten, können Sie diese nach Belieben verketten:
Hier ist mein erster Vorschlag ohne Prozessersetzung, der jedoch eine Verkettung / rekursive Verwendung ermöglicht, ohne die Daten und die Ausgabe zu mischen:
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 zummd5sum
Programm um, während2> >(sha1sum)
STDERR zumsha1sum
Programm umgeleitet wird .Beachten Sie, dass die Reihenfolge
2>
und>
wichtig zu sein scheint, ich muss2>
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.
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:
Wenn Sie das Ergebnis erfassen und in einem Skript verwenden möchten, funktioniert dies auch:
Jetzt
$A
ist eine Zeichenfolge, die die gesamte Ausgabe einschließlich der Zeilenumbrüche enthält. Sie können die Werte auch später analysieren:Ich bin mir jedoch nicht sicher, ob Sie Garantien für die Bestellung der Ausgabe haben.
quelle
tee
Die clevere Verwendung der Ausgabeumleitung in der Shell ist der richtige Weg. Dies spart viele Ressourcen, insbesondere beim Lesen großer Dateien.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:
quelle
// Skript beginnt hier
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
quelle