Md5 ve sha1 sağlama toplamlarını tek bir komutla boşaltın!


9

Bir komutla md5 , sha1 karma değerini hesaplamak için komut veya yardımcı programlar arıyorum .
Şu anda ubuntu değer hesaplamak için sha1sumve md5sumkomut var hash.


2
Onu neden istiyorsun? Genellikle karmaları oluşturduktan sonra doğrulamak istersiniz. Örneğin, bir karma oluşturmak için: md5sum hosts. Sonra, bu sonucu doğrulamak için: echo "b9adfb2e2022a3a84ba06b55eeb2dc64 hosts" | md5sum --check(vermelidir: hosts: OK)
Lekensteyn

2
varsayalım 500 GB sabit sürücünün 'hash değerini' hesaplamak istiyorsanız, yani sha1 ve md5. tek tek hesaplarsam (sha1sum ve md5sum kullanarak) çift zaman alır. ama windows yazılımı ile aynı tek yardımcı programları ile yapılabilir, o zaman benim istenen cevap olacaktır.
MS Parmar

Yanıtlar:


9

Bunu bazı uygun bash ninja-fu ile başarabilirsiniz. :)

Her seferinde bir tane hesaplama prosedürünü biliyorsunuz:

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

Düzenleme: @gertvdijk önerdiği gibi ve bilgi sayfalarını biraz daha okumak, bu doğrudan yönlendirmeleri olmadan, modern kabuklar tarafından desteklenen tee ve Süreç Yerine koyma ile yapılabilir. Bu şekilde, tee kullanarak verilerinizi iki işleme ve bir dosyaya aktarabilirsiniz:

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

Daha fazlasına ihtiyacınız varsa zincirleme yapmak da mümkündür, ancak tüm alt işlemlerden STDOUT'a dikkat etmeniz gerekir. Bu size beklenen sonucu VERMEZ, ancak ilk iki sağlama toplamını output.txt dosyasındaki verilerle karıştırır:

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

Sağlama toplamlarını değiştirilen işlemlerin içindeki bir dosyaya yeniden yönlendirirseniz, bunları istediğiniz gibi zincirleyebilirsiniz:

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

İşte süreç ikamesi olmadan ilk öneri, ancak veri ve çıktıyı karıştırmadan zincirleme / özyinelemeli kullanıma izin veren:

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

Buradaki hile tee, verileri STDOUT'a ve bir dosyaya kopyalayan kullanmaktır . Verileri / proc / self / fd / 2 dosyasına yazmasını söyleyerek zekiyiz, bu da her zaman geçerli işlem 'STDERR dosya tanımlayıcısıdır. > >(program)Sözdizimi ile her dosya tanımlayıcısını dosya yerine programın STDIN'ine yeniden yönlendirebiliriz. Aynen |, ama daha fazla kontrol ile. > >(md5sum)STDOUT'u md5sumprograma, 2> >(sha1sum)STDERR'ı sha1sumprograma yönlendirir .

Unutmayın 2>ve >önem sırasına göre , 2>önce komut satırına koymak zorundayım . Bunlar sağdan sola değerlendirilir, ancak bunun neden bir fark yarattığından emin değilim.

Bunu bir dosyada veya sabit sürücüde yapmak için, "echo abc" yerine bir kedi veya bir dd koymalısınız, örn:

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

Bununla ilgili en güzel şey, aslında sadece ikisini değil, aynı anda birkaçını tekrarlayabileceğiniz ve çalıştırabileceğinizdir. Sözdizimi kıllı olur, ancak bu işe yarar:

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

Sonucu yakalamak ve bir komut dosyasında kullanmak istiyorsanız, bu da işe yarar:

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

Şimdi $Ayeni satırlar dahil tüm çıktıları içeren bir dize. Değerleri daha sonra da ayrıştırabilirsiniz:

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

Çıktının siparişiyle ilgili herhangi bir garantiniz olduğundan emin değilim.


2
+1. teeve çıkış yönlendirmesinin kabukta akıllıca kullanılması yoludur. Bu, özellikle büyük dosyaları okurken çok fazla kaynak tasarrufu sağlar.
gertvdijk

2
Bu arada, akışın çıktısını çoğaltmak için stderr'e yönlendirmeniz gerekmediğini düşünüyorum. Bir alt kabuk kullanımı da stderr'ı koruyarak hile yapacaktır. Bir blog yayınında örneğimi burada görebilirsiniz .
gertvdijk

@gertvdijk Doğru, işlem ikamesi daha temiz ve zincirlemesi daha kolay (tekrarlamaya gerek yok). Yanıtımı güncelleyeceğim.
ketil

Güzel. Yapabilirsem sana başka bir oy verirdim. :-)
gertvdijk

Bunlar güzel küçük dosyalar için iyi çalışırken, kaçınmak istediğim daha büyük dosyalar için çabaları ve işlem süresini ikiye katlıyorsunuz ...
EkriirkE

3

Komut satırı ile size yardımcı olamaz ama quickhash adında bir GUI aracı biliyorum .

Bu aracı Quickhash'tan indirebilirsiniz

Açıklama:

Dosyaların (bir klasör yapısı boyunca tek tek veya özyinelemeli olarak) metin ve (Linux'ta) disklerin hızlı seçimini ve sonraki karmasını sağlayan bir Linux ve Windows GUI. Linux için tasarlanmıştır, ancak Windows için de mevcuttur. MD5, SHA1, SHA256, SHA512 mevcut. Çıktı panoya kopyalandı veya CSV \ HTML dosyası olarak kaydedildi.


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 buradan başlıyor

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 ('Son Yığın (bayt):', custom_checksum_profile ['last_chunk_size']) 'SH5 ::', custom_checksum_profile ['md5_checksum'] yazdır 'SHA1 ::', custom_checksum '] print' Stop Time :: ', custom_checksum_profile [' stoptime '] print' Processing Time :: ', custom_checksum_profile [' processtime '] yazarak TypeError: #' NoneType 'nesnesi abone olunamazsa --- temelde giriş dosyası açılamadı # yükseltme pass # csv çıktı

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.