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.
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. :)
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:
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:
+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.
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.
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)
md5sum hosts
. Następnie, w celu weryfikacji tej wyniki:echo "b9adfb2e2022a3a84ba06b55eeb2dc64 hosts" | md5sum --check
(należy podać:hosts: OK
)Odpowiedzi:
Możesz to osiągnąć za pomocą odpowiedniego ninja-fu. :)
Znasz procedurę obliczania pojedynczo:
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:
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:
Jeśli przekierujesz sumy kontrolne do pliku w podstawionych procesach, możesz połączyć je w dowolny sposób:
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:
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 domd5sum
programu, a2> >(sha1sum)
przekierowuje STDERR dosha1sum
programu.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 .:
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:
Jeśli chcesz przechwycić wynik i użyć go w skrypcie, to też działa:
Teraz
$A
jest ciąg zawierający wszystkie dane wyjściowe, w tym nowe wiersze. Możesz również przeanalizować wartości później:Nie jestem jednak pewien, czy masz jakiekolwiek gwarancje dotyczące zamawiania wyników.
źródło
tee
i 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.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:
źródło
// Skrypt zaczyna się tutaj
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
źródło