Dump md5 dan sha1 checksum dengan satu perintah!


9

Saya mencari perintah atau utilitas untuk menghitung md5 , nilai hash sha1 oleh satu perintah.
Saat ini ubuntu memiliki sha1sumdan md5sumperintah untuk menghitung hashnilai.


2
Mengapa kamu menginginkannya? Biasanya Anda ingin dapat memverifikasi hash setelah membuatnya. Misalnya, untuk menghasilkan hash: md5sum hosts. Kemudian, untuk memverifikasi hasil ini: echo "b9adfb2e2022a3a84ba06b55eeb2dc64 hosts" | md5sum --check(harus memberikan: hosts: OK)
Lekensteyn

2
misalkan jika ingin menghitung 'nilai hash' hard drive 500 GB yaitu sha1 dan md5. jika saya menghitung satu per satu (menggunakan sha1sum dan md5sum) akan membutuhkan waktu ganda. tetapi jika bisa dilakukan dengan utilitas tunggal sama dengan perangkat lunak windows maka akan menjadi jawaban yang saya inginkan.
MS Parmar

Jawaban:


9

Anda dapat mencapai ini dengan bash ninja-fu. :)

Anda tahu prosedur untuk menghitung satu per satu:

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

Sunting: seperti yang disarankan @gertvdijk, dan membaca halaman info sedikit lebih banyak, ini dapat dilakukan secara langsung dengan tee dan Proses Pergantian didukung oleh shell modern, tanpa arahan ulang. Dengan cara ini Anda dapat meneruskan data Anda ke dua proses dan satu file menggunakan tee:

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

Mungkin juga untuk melakukan rantai jika Anda membutuhkan lebih banyak, tetapi Anda harus mengurus STDOUT dari semua subproses. Ini TIDAK akan memberi Anda hasil yang diharapkan, tetapi mencampur dua checksum pertama bersama dengan data di output.txt:

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

Jika Anda mengarahkan checksum ke file di dalam proses yang disubstitusi, Anda dapat memilah ini sesuka Anda:

$ echo abc | tee >(md5sum > /tmp/md5.txt) >(sha1sum > /tmp/sha1.txt) | tee >(sha256sum > /tmp/sha256.txt) >(sha512sum > /tmp/sha512.txt) > output.txt

Inilah saran awal saya tanpa substitusi proses, tetapi memungkinkan chaining / penggunaan rekursif tanpa mencampurkan data dan output:

$ echo abc | tee -a /proc/self/fd/2 2> >(sha1sum) > >(md5sum)
0bee89b07a248e27c83fc3d5951213c1  -
03cfd743661f07975fa2f1220c5194cbaff48451  -

Kuncinya di sini adalah menggunakan tee, yang menggandakan data ke STDOUT dan file. Kami pandai dengan menyuruhnya menulis data ke file / proc / self / fd / 2, yang kebetulan selalu menjadi deskriptor file STDERR proses saat ini. Dan dengan > >(program)sintaks kita dapat mengarahkan setiap deskriptor file ke program STDIN daripada file. Sama seperti |, tetapi dengan kontrol lebih. > >(md5sum)pengalihan STDOUT ke md5sumprogram, sementara 2> >(sha1sum)pengalihan STDERR ke sha1sumprogram.

Perhatikan bahwa urutan 2>dan >tampaknya penting, saya harus menempatkan 2>dulu pada baris perintah. Ini dievaluasi dari kanan ke kiri, tetapi saya tidak yakin mengapa ini membuat perbedaan.

Untuk melakukan ini pada file atau hard drive, Anda harus mengganti "echo abc" dengan cat atau dd, misalnya:

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

Hal bagus tentang ini adalah Anda dapat benar-benar melakukan recurse dan menjalankan beberapa sekaligus, bukan hanya dua. Sintaksnya menjadi berbulu, tetapi ini bekerja:

echo abc | tee -a /proc/self/fd/2 2> >(tee -a /proc/self/fd/2 2> >(sha256sum) > >(sha384sum) ) > >(sha512sum)

Jika Anda ingin menangkap hasilnya dan menggunakannya dalam skrip, itu juga berfungsi:

A=$(echo abc | tee -a /proc/self/fd/2 2> >(sha1sum) > >(md5sum))

Sekarang $Aadalah string yang berisi semua output, termasuk baris baru. Anda juga dapat menguraikan nilai-nilai nanti:

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

Saya tidak yakin Anda memiliki jaminan tentang pemesanan output.


2
+1. teedan penggunaan pengalihan output yang cerdas dalam shell adalah cara yang harus dilakukan. Ini menghemat banyak sumber daya, terutama saat membaca file besar.
gertvdijk

2
Ngomong-ngomong, saya pikir Anda tidak perlu mengarahkan ulang ke stderr untuk menduplikasi output stream. Penggunaan subkulit juga akan melakukan trik, mempertahankan stderr. Lihat contoh saya di sini di posting blog .
gertvdijk

@ gertvdijk Benar, proses substitusi lebih bersih, dan lebih mudah untuk dirantai (Anda tidak perlu berulang). Saya akan memperbarui tanggapan saya.
ketil

Bagus. Saya akan memberi Anda dukungan lagi jika saya bisa. :-)
gertvdijk

Meskipun ini bekerja dengan baik untuk file kecil yang bagus, Anda menggandakan upaya dan waktu pemrosesan untuk file yang lebih besar yang saya ingin hindari ...
EkriirkE

3

Tidak dapat membantu Anda dengan baris perintah tapi saya tahu alat GUI bernama quickhash.

Anda dapat mengunduh alat itu dari Quickhash

Deskripsi:

Linux dan Windows GUI untuk mengaktifkan pemilihan cepat dan hashing file berikutnya (secara individu atau secara rekursif di seluruh struktur folder) teks dan (pada Linux) disk. Dirancang untuk Linux, tetapi juga tersedia untuk Windows. MD5, SHA1, SHA256, SHA512 tersedia. Output disalin ke clipboard atau disimpan sebagai file 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.

// Script mulai dari sini

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']) cetak 'MD5 ::', custom_checksum_profile ['md5_checksum'] print 'SHA1check' custom_chum ' '] cetak' Stop Time :: ', custom_checksum_profile [' stoptime '] cetak' Processing Time :: ', custom_checksum_profile [' processtime '] kecuali TypeError: # objek' NoneType 'tidak dapat disubkripsikan --- pada dasarnya ini harus terjadi ketika file input tidak dapat dibuka # naik 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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.