Descarrega as somas de verificação de md5 e sha1 com um único comando!

8

Eu estou procurando por comando ou utilitários para calcular md5 , valor de hash sha1 em um comando.
No momento, o ubuntu tem o comando sha1sum e md5sum para calcular hash value.

    
por M S Parmar 03.12.2013 / 05:44

3 respostas

8

Você pode conseguir isso com um bom ninja-fu bash. :)

Você conhece o procedimento para calcular um de cada vez:

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

Edit: como @gertvdijk sugerido, e lendo as páginas de informações um pouco mais, isso pode ser feito diretamente com tee e Substituição de Processos suportados por shells modernos, sem redirecionamentos. Desta forma você pode passar seus dados para dois processos e um arquivo usando tee:

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

Também é possível encadear se você precisar de mais, mas você precisa cuidar do STDOUT de todos os subprocessos. Isto NÃO lhe dará o resultado esperado, mas mistura as duas primeiras somas de verificação juntamente com os dados em output.txt:

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

Se você redirecionar as somas de verificação para um arquivo dentro dos processos substituídos, você poderá encadear essas que você quiser:

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

Esta é a minha sugestão inicial sem substituição de processo, mas que permite o uso encadeamento / recursivo sem misturar os dados e a saída:

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

O truque aqui é usar tee , que duplica os dados para STDOUT e um arquivo. Estamos sendo espertos ao dizer para gravar os dados no arquivo / proc / self / fd / 2, que sempre é o descritor de arquivo STDERR do processo atual. E com a sintaxe > >(program) , podemos redirecionar cada descritor de arquivo para STDIN de um programa em vez de um arquivo. Apenas como | , mas com mais controle. > >(md5sum) redireciona STDOUT para o programa md5sum , enquanto 2> >(sha1sum) redireciona STDERR para o programa sha1sum .

Observe que a ordem de 2> e > parece ser importante, mas preciso colocar 2> primeiro na linha de comando. Estes são avaliados da direita para a esquerda, mas não sei por que isso faz diferença.

Para fazer isso em um arquivo ou disco rígido, você deve substituir "echo abc" por um gato ou um dd, por exemplo:

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

O mais bacana disso é que você pode realmente reciclar e executar vários ao mesmo tempo, não apenas dois. A sintaxe fica peluda, mas isso funciona:

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

Se você deseja capturar o resultado e usá-lo em um script, isso também funciona:

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

Agora, $A é uma string contendo toda a saída, incluindo novas linhas. Você pode analisar os valores mais tarde também:

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

Não tenho certeza se você tem alguma garantia sobre o pedido de saída.

    
por ketil 04.12.2014 / 12:51
3

Não posso ajudá-lo com a linha de comando, mas conheço uma ferramenta GUI chamada quickhash.

Você pode fazer o download dessa ferramenta em Quickhash

Descrição:

  

Uma GUI do Linux e do Windows para ativar a seleção rápida e subsequente   hash de arquivos (individualmente ou recursivamente em uma pasta   estrutura) texto e (no Linux) discos. Projetado para Linux, mas também   disponível para o Windows. MD5, SHA1, SHA256, SHA512 disponível. Saída   copiado para a área de transferência ou salvo como arquivo CSV \ HTML.

    
por Ten-Coin 03.12.2013 / 05:57
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.

// O script começa daqui

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 ['tempo de parada']             print 'Processing Time ::', custom_checksum_profile ['processtime']         exceto TypeError: o objeto # 'NoneType' não é subscrito - basicamente isso deve acontecer quando o arquivo de entrada não puder ser aberto             #levantar             passar         saída 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)
    
por M S Parmar 21.02.2014 / 06:44

Tags