1つのコマンドでmd5とsha1のチェックサムをダンプします!


9

1つのコマンドでmd5、sha1ハッシュ値を計算するためのコマンドまたはユーティリティを探しています。
現在、ubuntuには値を計算するためのコマンドがsha1sumあります。md5sumhash


2
なんでそれがいいの?通常、ハッシュを生成した後にハッシュを検証できるようにしたいと考えています。例えば、ハッシュを生成しますmd5sum hosts。次に、この結果を検証するには:(echo "b9adfb2e2022a3a84ba06b55eeb2dc64 hosts" | md5sum --check与えられるべきもの:hosts: OK
Lekensteyn

2
500 GBのハードドライブの「ハッシュ値」、つまりsha1とmd5の両方を計算したいとします。(sha1sumとmd5sumを使用して)1つずつ計算すると、2倍の時間がかかります。しかし、Windowsソフトウェアと同じ単一のユーティリティで実行できる場合は、私の望みの答えになります。
MS Parmar

回答:


9

適切なbash ninja-fuでこれを達成できます。:)

一度に1つずつ計算する手順を知っています。

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

編集:@gertvdijkが示唆しているように、情報ページをもう少し読んでください。これは、リダイレクトなしで、最新のシェルでサポートされているteeとProcess Substitutionを使用して直接実行できます。このようにして、teeを使用してデータを2つのプロセスと1つのファイルに渡すことができます。

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

さらに必要な場合は連鎖することも可能ですが、すべてのサブプロセスからSTDOUTを処理する必要があります。これは期待される結果を提供しませんが、最初の2つのチェックサムと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」を猫またはddに置き換える必要があります。例:

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

これについての気の利いたことは、実際には、2つだけでなく、複数を同時に再帰して実行できることです。構文は複雑になりますが、これは機能します:

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

2
ちなみに、ストリームの出力を複製するためにstderrにリダイレクトする必要はないと思います。サブシェルを使用することでも、stderrを維持することができます。こちらのブログ投稿で私の例をご覧ください。
gertvdijk 14

@gertvdijkそうです、プロセス置換はよりクリーンで、チェーンしやすくなっています(再帰する必要はありません)。返信を更新します。
2014

いいね。できれば、別の賛成票を差し上げます。:-)
gertvdijk

これらは素敵な小さなファイルに対してはうまく機能しますが、回避したい大きなファイルに対しては労力と処理時間が2倍になります...
EkriirkE

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 '] print' Stop Time :: '、custom_checksum_profile [' stoptime '] print' Processing Time :: '、custom_checksum_profile [' processtime '] except TypeError:#' NoneType 'object is subscriptable ---基本的にこれは、入力ファイルを開けませんでした#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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.