Дамп контрольных сумм md5 и sha1 с помощью одной команды!
9
Я ищу команду или утилиты для вычисления хеш-значения md5 , sha1 одной командой.
Сейчас убунту есть sha1sumи md5sumкоманды для вычисления hashзначения.
Зачем тебе это? Обычно вы хотите иметь возможность проверять хэши после их генерации. Например, для создания хеш: md5sum hosts. Затем, чтобы проверить этот результат: echo "b9adfb2e2022a3a84ba06b55eeb2dc64 hosts" | md5sum --check(должен дать: hosts: OK)
Lekensteyn
2
Предположим, если вы хотите вычислить «хэш-значение» для 500 ГБ жесткого диска, т.е. как sha1, так и md5. если я вычислю один за другим (используя sha1sum и md5sum), это займет двукратное время. но если бы это можно было сделать с помощью одних и тех же утилит, как в программном обеспечении Windows, то мой ответ был бы желаемым.
MS Parmar
Ответы:
9
Вы можете достичь этого с помощью правильного ниндзя-фу. :)
Редактировать: как предложил @gertvdijk, и, читая информационные страницы немного больше, это можно сделать напрямую с помощью tee и Process Substitution, поддерживаемых современными оболочками, без перенаправлений. Таким образом, вы можете передать свои данные двум процессам и одному файлу, используя tee:
$ echo abc | tee >(md5sum) >(sha1sum) > output.txt
Также возможно связать, если вам нужно больше, но вы должны позаботиться о STDOUT из всех подпроцессов. Это НЕ даст ожидаемого результата, но смешает первые две контрольные суммы с данными в output.txt:
$ echo abc | tee >(md5sum) >(sha1sum) | tee >(sha256sum) >(sha512sum) > output.txt
Если вы перенаправите контрольные суммы в файл внутри замещенных процессов, вы можете связать их по своему усмотрению:
Вот мое первоначальное предложение без подстановки процесса, но которое позволяет использовать цепочку / рекурсивное использование без смешивания данных и вывода:
$ echo abc | tee -a /proc/self/fd/2 2> >(sha1sum) > >(md5sum)
0bee89b07a248e27c83fc3d5951213c1 -
03cfd743661f07975fa2f1220c5194cbaff48451 -
Хитрость здесь в том, чтобы использовать tee, который дублирует данные в STDOUT и файл. Мы ведем себя умно, приказывая записать данные в файл / proc / self / fd / 2, который всегда является дескриптором файла STDERR текущего процесса. А с помощью > >(program)синтаксиса мы можем перенаправить каждый файловый дескриптор в STDIN программы, а не в файл. Точно так же |, но с большим контролем. > >(md5sum)перенаправляет STDOUT в md5sumпрограмму, а 2> >(sha1sum)перенаправляет STDERR в sha1sumпрограмму.
Обратите внимание, что порядок 2>и, >кажется, имеет значение, я должен 2>сначала поставить в командной строке. Они оцениваются справа налево, но я не уверен, почему это имеет значение.
Чтобы сделать это для файла или жесткого диска, вы должны заменить «echo abc» на cat или dd, например:
dd if=/dev/sda bs=8k | tee -a /proc/self/fd/2 2> >(sha1sum) > >(md5sum)
Отличная вещь в этом заключается в том, что вы можете рекурсировать и запускать несколько одновременно, а не только два. Синтаксис становится волосатым, но это работает:
echo abc | tee -a /proc/self/fd/2 2> >(tee -a /proc/self/fd/2 2> >(sha256sum) > >(sha384sum) ) > >(sha512sum)
Если вы хотите захватить результат и использовать его в сценарии, это тоже работает:
A=$(echo abc | tee -a /proc/self/fd/2 2> >(sha1sum) > >(md5sum))
Теперь $Aэто строка, содержащая весь вывод, включая переводы строки. Вы также можете разобрать значения позже:
+1. teeи разумное использование перенаправления вывода в оболочке - путь. Это экономит много ресурсов, особенно при чтении больших файлов.
gertvdijk
2
Кстати, я думаю, вам не нужно перенаправлять на stderr, чтобы дублировать вывод потока. Использование subhell также поможет, поддерживая stderr. Смотрите мой пример здесь в блоге .
gertvdijk
@gertvdijk Правильно, процесс замещения чище и проще в цепочке (вам не нужно повторять). Я обновлю свой ответ.
Кетил
Ницца. Я бы дал тебе еще один голос, если бы мог. :-)
gertvdijk
Хотя это хорошо работает для небольших файлов, вы удваиваете усилия и время обработки больших файлов, которых я
стараюсь
3
Не могу помочь вам с командной строкой, но я знаю инструмент с графическим интерфейсом, называемый quickhash.
Графический интерфейс Linux и Windows для быстрого выбора и последующего хеширования файлов (по отдельности или рекурсивно по всей структуре папок), текстовых и (в Linux) дисков. Предназначен для Linux, но также доступен для Windows. Доступны MD5, SHA1, SHA256, SHA512. Вывод скопирован в буфер обмена или сохранен как файл 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.
// скрипт начинается отсюда
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 ('Последний блок (байты):', custom_checksum_profile ['last_chunk_size']) печатать 'MD5 ::', custom_checksum_profile ['md5_checksum'] печатать 'SHA1 ::', custom_checksum_pr '] print' Stop Time :: ', custom_checksum_profile [' stoptime '] print' Processing Time :: ', custom_checksum_profile [' processtime '] за исключением TypeError: # NoneType' объект не является подписным - в основном это должно происходить, когда входной файл не может быть открыт #raise pass # csv output
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
. Затем, чтобы проверить этот результат:echo "b9adfb2e2022a3a84ba06b55eeb2dc64 hosts" | md5sum --check
(должен дать:hosts: OK
)Ответы:
Вы можете достичь этого с помощью правильного ниндзя-фу. :)
Вы знаете процедуру расчета по одному:
Редактировать: как предложил @gertvdijk, и, читая информационные страницы немного больше, это можно сделать напрямую с помощью tee и Process Substitution, поддерживаемых современными оболочками, без перенаправлений. Таким образом, вы можете передать свои данные двум процессам и одному файлу, используя tee:
Также возможно связать, если вам нужно больше, но вы должны позаботиться о STDOUT из всех подпроцессов. Это НЕ даст ожидаемого результата, но смешает первые две контрольные суммы с данными в output.txt:
Если вы перенаправите контрольные суммы в файл внутри замещенных процессов, вы можете связать их по своему усмотрению:
Вот мое первоначальное предложение без подстановки процесса, но которое позволяет использовать цепочку / рекурсивное использование без смешивания данных и вывода:
Хитрость здесь в том, чтобы использовать
tee
, который дублирует данные в STDOUT и файл. Мы ведем себя умно, приказывая записать данные в файл / proc / self / fd / 2, который всегда является дескриптором файла STDERR текущего процесса. А с помощью> >(program)
синтаксиса мы можем перенаправить каждый файловый дескриптор в STDIN программы, а не в файл. Точно так же|
, но с большим контролем.> >(md5sum)
перенаправляет STDOUT вmd5sum
программу, а2> >(sha1sum)
перенаправляет STDERR вsha1sum
программу.Обратите внимание, что порядок
2>
и,>
кажется, имеет значение, я должен2>
сначала поставить в командной строке. Они оцениваются справа налево, но я не уверен, почему это имеет значение.Чтобы сделать это для файла или жесткого диска, вы должны заменить «echo abc» на cat или dd, например:
Отличная вещь в этом заключается в том, что вы можете рекурсировать и запускать несколько одновременно, а не только два. Синтаксис становится волосатым, но это работает:
Если вы хотите захватить результат и использовать его в сценарии, это тоже работает:
Теперь
$A
это строка, содержащая весь вывод, включая переводы строки. Вы также можете разобрать значения позже:Я не уверен, что у вас есть какие-либо гарантии относительно порядка вывода.
источник
tee
и разумное использование перенаправления вывода в оболочке - путь. Это экономит много ресурсов, особенно при чтении больших файлов.Не могу помочь вам с командной строкой, но я знаю инструмент с графическим интерфейсом, называемый quickhash.
Вы можете скачать этот инструмент из Quickhash
Описание:
источник
// скрипт начинается отсюда
custom_checksum_profile ['file_read_iterations']) # print ('Последний блок (байты):', custom_checksum_profile ['last_chunk_size']) печатать 'MD5 ::', custom_checksum_profile ['md5_checksum'] печатать 'SHA1 ::', custom_checksum_pr '] print' Stop Time :: ', custom_checksum_profile [' stoptime '] print' Processing Time :: ', custom_checksum_profile [' processtime '] за исключением TypeError: # NoneType' объект не является подписным - в основном это должно происходить, когда входной файл не может быть открыт #raise pass # csv output
источник