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

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

我正在寻找用于计算的命令或实用程序md5,sha1 哈希值。
目前 ubuntu 有sha1summd5sum用于计算值的命令hash

答案1

您可以使用一些适当的 bash ninja-fu 来实现这一点。:)

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

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

编辑:正如@gertvdijk 所建议的,并阅读更多信息页面,这可以直接使用现代 shell 支持的 tee 和进程替换来完成,而无需重定向。这样,您可以使用 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>在命令行上将其放在第一位。它们是从右到左进行评估的,但我不确定为什么这会产生影响。

要在文件或硬盘上执行此操作,您应该用 cat 或 dd 替换“echo abc”,例如:

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

无法通过命令行帮助您,但我知道一个名为快速哈希。

您可以从以下位置下载该工具快速哈希

描述:

Linux 和 Windows GUI 可快速选择文件(单个或在整个文件夹结构中递归)并随后对文本和(在 Linux 上)磁盘进行哈希处理。专为 Linux 设计,但也适用于 Windows。MD5、SHA1、SHA256、SHA512 可用。输出复制到剪贴板或保存为 CSV\HTML 文件。

答案3

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'] print '停止时间 ::', custom_checksum_profile['stoptime'] print '处理时间 ::', custom_checksum_profile['processtime'] except 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)

答案4

你不需要“攻击主义”(又称进程替换)或者如果你没有 bash,但只有coreutils GNU 工具,你可以这样做球座命名管道

一行代码即可:

$ mkfifo sha256; sha256sum sha256 & pv ~/bigfile | tee sha256 | md5sum; rm sha256
[1] 7321
15,5GiB 0:02:57 [89,3MiB/s] [===========================================>] 100%            
02483696f9e698e1cc573bd0154a43e6  -
$ 9a5f63266b2bf13cb09953cd000837dd2b66ce8e5e2945369927b5ec4e324f42  sha256

请注意,我正在使用光伏这里显示进度条(这是一个大文件:15.5GB),但一个简单的会工作。

单独步骤:

  • 创建 fifo
  • 在 fifo 上运行其中一个校验和
  • 在另一个 shell 中,使用 'cat' (或 'pv') 将文件 'tee-ing' 到 fifo 和另一个校验和
  • 删除先进先出

您可以通过添加更多 fifo 和 tee 来计算您想要的校验和数量。与 @ketil 的回答不同,它是“常规”的,您不需要对每个第二校验和执行不同的操作,只需将它们堆叠即可!

你可以用以下方法让它更简单撒尿看这里),但这个实用程序更多工具可能没有预装在你的发行版上,不像核心工具

如果您希望结果在文件中而不是在屏幕上,只需添加类似的重定向,它就会保持“常规”并带有许多校验和

mkfifo sha256; rm -f sums.txt; sha256sum sha256 >>sums.txt & pv ~/bigfile | tee sha256 | md5sum >>sums.txt; rm sha256

相关内容