使用单个命令转储md5和sha1校验和!


9

我正在寻找一个命令或实用程序,以通过一个命令来计算md5,sha1哈希值。
眼下Ubuntu已经sha1summd5sum计算指令hash值。


2
你为什么需要它?通常,您希望能够在生成哈希之后对其进行验证。例如,要生成一个哈希:md5sum hosts。然后,为了验证这个结果:echo "b9adfb2e2022a3a84ba06b55eeb2dc64 hosts" | md5sum --check(应该给:hosts: OK
Lekensteyn

2
假设是否要计算500 GB硬盘的“哈希值”,即sha1和md5。如果我一一计算(使用sha1sum和md5sum)将花费两倍的时间。但是,如果可以使用与Windows软件相同的单个实用程序完成操作,那将是我想要的答案。
MS Parmar

Answers:


9

您可以使用一些适当的bash ninja-fu实现此目的。:)

您知道一次计算一个的过程:

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

编辑:正如@gertvdijk所建议的,并阅读更多的信息页面,这可以使用现代shell支持的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 >(md5sum > /tmp/md5.txt) >(sha1sum > /tmp/sha1.txt) | tee >(sha256sum > /tmp/sha256.txt) >(sha512sum > /tmp/sha512.txt) > 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是一个包含所有输出(包括换行符)的字符串。您也可以稍后解析这些值:

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

我不确定您对输出的顺序有什么保证。


2
+1。tee并且在外壳中巧妙地使用输出重定向是必经之路。这样可以节省大量资源,尤其是在读取大文件时。
gertvdijk 2014年

2
顺便说一句,我认为您无需重定向到stderr以复制流的输出。使用subshel​​l也可以解决问题,并保持stderr。在博客文章中查看我的示例。
gertvdijk 2014年

@gertvdijk是的,进程替换更干净,并且更容易链接(您无需递归)。我将更新我的回复。
ketil 2014年

真好 如果可以的话,我会再给你投票。:-)
gertvdijk 2014年

尽管这些文件对于不错的小文件效果很好,但是您要加倍努力处理大型文件,而我希望避免...
EkriirkE 2015年

3

无法使用命令行帮助您,但我知道一个名为quickhash的GUI工具

您可以从Quickhash下载该工具

描述:

一个Linux和Windows GUI,用于快速选择和随后散列文件(在整个文件夹结构中单独或递归)文本和(在Linux上)磁盘。专为Linux设计,但也适用于Windows。提供MD5,SHA1,SHA256,SHA512。输出复制到剪贴板或保存为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.

//脚本从这里开始

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_profile ['sha1_checksum ']打印'Stop Time ::',custom_checksum_profile ['stoptime']打印'Processing Time ::',custom_checksum_profile ['processtime'],但TypeError:#'NoneType'对象不可下标---基本上这应该在输入文件无法打开#raise pass#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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.