Zrzuć sumy kontrolne MD5 i SHA1 za pomocą jednego polecenia!


9

Szukam polecenia lub narzędzi do obliczania wartości skrótu md5 , sha1 za pomocą jednego polecenia.
W tej chwili ubuntu ma sha1sumi md5sumpolecenie do obliczania hashwartości.


2
Dlaczego tego chcesz? Zwykle chcesz mieć możliwość weryfikacji skrótów po ich wygenerowaniu. Na przykład, w celu wygenerowania skrótu: md5sum hosts. Następnie, w celu weryfikacji tej wyniki: echo "b9adfb2e2022a3a84ba06b55eeb2dc64 hosts" | md5sum --check(należy podać: hosts: OK)
Lekensteyn

2
załóżmy, że jeśli chcesz obliczyć „wartość skrótu” dla dysku twardego 500 GB, tj. zarówno sha1, jak i md5. jeśli obliczę jeden po drugim (używając sha1sum i md5sum) zajęłoby to podwójny czas. ale jeśli można to zrobić za pomocą pojedynczych narzędzi, takich jak oprogramowanie systemu Windows, byłaby to moja pożądana odpowiedź.
MS Parmar,

Odpowiedzi:


9

Możesz to osiągnąć za pomocą odpowiedniego ninja-fu. :)

Znasz procedurę obliczania pojedynczo:

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

Edycja: zgodnie z sugestią @gertvdijk i nieco więcej czytając strony informacyjne, można to zrobić bezpośrednio za pomocą tee i Process Substitution obsługiwanych przez nowoczesne powłoki, bez przekierowań. W ten sposób możesz przekazać swoje dane do dwóch procesów i jednego pliku za pomocą tee:

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

Możliwe jest również połączenie, jeśli potrzebujesz więcej, ale musisz zadbać o STDOUT ze wszystkich podprocesów. To NIE da oczekiwanego rezultatu, ale łączy dwie pierwsze sumy kontrolne z danymi w pliku output.txt:

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

Jeśli przekierujesz sumy kontrolne do pliku w podstawionych procesach, możesz połączyć je w dowolny sposób:

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

Oto moja wstępna sugestia bez zastępowania procesu, ale która pozwala na łączenie w łańcuch / rekurencyjne użycie bez mieszania danych i danych wyjściowych:

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

Sztuka polega na tym, aby użyć tee, który powiela dane do STDOUT i pliku. Jesteśmy sprytni, mówiąc mu, aby zapisał dane do pliku / proc / self / fd / 2, który zawsze jest deskryptorem pliku STDERR bieżącego procesu. Dzięki > >(program)składni możemy przekierować każdy deskryptor pliku do STDIN programu zamiast do pliku. Tak jak |, ale z większą kontrolą. > >(md5sum)przekierowuje STDOUT do md5sumprogramu, a 2> >(sha1sum)przekierowuje STDERR do sha1sumprogramu.

Zauważ, że kolejność 2>i >wydaje się mieć znaczenie, muszę 2>najpierw ustawić w linii poleceń. Są one oceniane od prawej do lewej, ale nie jestem pewien, dlaczego to robi różnicę.

Aby to zrobić na pliku lub dysku twardym, należy zamienić „echo abc” na cat lub dd, np .:

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

Sprytne w tym jest to, że możesz faktycznie rekurencyjnie i uruchomić kilka jednocześnie, nie tylko dwa. Składnia staje się owłosiona, ale to działa:

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

Jeśli chcesz przechwycić wynik i użyć go w skrypcie, to też działa:

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

Teraz $Ajest ciąg zawierający wszystkie dane wyjściowe, w tym nowe wiersze. Możesz również przeanalizować wartości później:

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

Nie jestem jednak pewien, czy masz jakiekolwiek gwarancje dotyczące zamawiania wyników.


2
+1. teei sprytne użycie przekierowania wyjścia w powłoce jest dobrym rozwiązaniem. Oszczędza to wiele zasobów, zwłaszcza podczas czytania dużych plików.
gertvdijk

2
Nawiasem mówiąc, myślę, że nie trzeba przekierowywać do stderr, aby powielić wyjście strumienia. Użycie podpowłoki również załatwi sprawę, utrzymując stderr. Zobacz mój przykład tutaj w poście na blogu .
gertvdijk

@gertvdijk Racja, podstawianie procesów jest czystsze i łatwiejsze do połączenia (nie trzeba powtarzać). Zaktualizuję moją odpowiedź.
ketil

Miły. Dałbym ci kolejny głos, gdybym mógł. :-)
gertvdijk

Chociaż działają one dobrze w przypadku ładnych małych plików,
podwajasz

3

Nie mogę ci pomóc z wierszem poleceń, ale znam narzędzie GUI o nazwie Quickhash.

Możesz pobrać to narzędzie z Quickhash

Opis:

GUI dla systemu Linux i Windows, umożliwiające szybki wybór i późniejsze mieszanie plików (indywidualnie lub rekurencyjnie w strukturze folderów) tekstu i dysków (w systemie Linux). Zaprojektowany dla systemu Linux, ale dostępny również dla systemu Windows. Dostępne MD5, SHA1, SHA256, SHA512. Dane wyjściowe skopiowane do schowka lub zapisane jako plik CSV \ HTML.


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.

// Skrypt zaczyna się tutaj

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_program '] print' Stop Time :: ', custom_checksum_profile [' stoptime '] print' Processing Time :: ', custom_checksum_profile [' processtime '] z wyjątkiem TypeError: # Obiekt „NoneType” nie podlega indeksowi --- w zasadzie powinno się to zdarzyć, gdy właściwość plik wejściowy nie mógł zostać otwarty #raise pass # wyjście 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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.