Despejar somas de verificação md5 e sha1 com um único comando!
9
Estou procurando comando ou utilitários para calcular md5 , sha1 valor hash por um comando.
Agora ubuntu tem sha1sume md5sumcomando para o cálculo de hashvalor.
Por que você quer isso? Geralmente, você deseja verificar os hashes depois de gerá-los. Por exemplo, para gerar um hash: md5sum hosts. Então, para verificar este resultado: echo "b9adfb2e2022a3a84ba06b55eeb2dc64 hosts" | md5sum --check(deve dar: hosts: OK)
Lekensteyn
2
suponha que se deseja calcular o 'valor hash' do disco rígido de 500 GB, ou seja, sha1 e md5. se eu calcular um por um (usando sha1sum e md5sum) levaria o dobro do tempo. mas se pudesse ser feito com utilitários únicos, igual ao software windows, seria a minha resposta desejada.
MS Parmar
Respostas:
9
Você pode conseguir isso com algum ninja-fu bash adequado. :)
Você conhece o procedimento para calcular um de cada vez:
Edit: como @gertvdijk sugeriu, e lendo as páginas de informações um pouco mais, isso pode ser feito diretamente com tee e Process Substitution suportadas por shells modernos, sem redirecionamentos. Dessa 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ê deve cuidar do STDOUT de todos os subprocessos. Isso NÃO fornecerá o resultado esperado, mas mistura as duas primeiras somas de verificação 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, poderá encadeá-las como desejar:
Aqui está minha sugestão inicial sem substituição de processo, mas que permite o encadeamento / uso 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 dizendo para gravar os dados no arquivo / proc / self / fd / 2, que sempre é o descritor de arquivos STDERR do processo atual. E com a > >(program)sintaxe, podemos redirecionar cada descritor de arquivo para o STDIN de um programa, em vez de um arquivo. Assim como |, mas com mais controle. > >(md5sum)redireciona STDOUT para o md5sumprograma, enquanto 2> >(sha1sum)redireciona STDERR para o sha1sumprograma.
Note que a ordem 2>e >parece importar, eu tenho que colocar 2>primeiro na linha de comando. Eles são avaliados da direita para a esquerda, mas não sei por que isso faz a 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)
A coisa bacana sobre isso é que você pode realmente recursar e executar várias ao mesmo tempo, não apenas duas. 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 sequência que contém toda a saída, incluindo novas linhas. Você também pode analisar os valores posteriormente:
+1. teee o uso inteligente do redirecionamento de saída no shell é o caminho a percorrer. Isso economiza muitos recursos, especialmente ao ler arquivos grandes.
Gdvdijk
2
A propósito, acho que você não precisa redirecionar para o stderr para duplicar a saída do fluxo. O uso de um subshell também fará o truque, mantendo o stderr. Veja meu exemplo aqui em uma postagem no blog .
Gdvdijk
@gertvdijk Certo, a substituição do processo é mais limpa e fácil de encadear (você não precisa se retribuir). Vou atualizar minha resposta.
Ketil
Agradável. Eu daria a você outro voto positivo, se pudesse. :-)
gertvdijk 4/14/14
Enquanto estes funcionam bem para agradáveis pequenos arquivos, você está dobrando os esforços e tempo para arquivos maiores processamento que eu estou olhando para evitar ...
EkriirkE
3
Não posso ajudá-lo com a linha de comando, mas eu conheço uma ferramenta GUI chamada quickhash.
Você pode fazer o download dessa ferramenta no Quickhash
Descrição:
Uma GUI do Linux e Windows para permitir a seleção rápida e o hash subsequente de arquivos (individual ou recursivamente em toda a estrutura de pastas) de texto e (no Linux) discos. Projetado para Linux, mas também disponível para Windows. Disponível MD5, SHA1, SHA256, SHA512. Saída copiada para a área de transferência ou salva como arquivo CSV \ HTML.
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 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 '] print' Stop Time :: ', custom_checksum_profile [' stoptime '] print' Processing Time :: ', custom_checksum_profile [' processtime '], exceto TypeError: #' NoneType 'objeto não é subscrito --- basicamente isso deve acontecer quando o não foi possível abrir o arquivo de entrada #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)
md5sum hosts
. Então, para verificar este resultado:echo "b9adfb2e2022a3a84ba06b55eeb2dc64 hosts" | md5sum --check
(deve dar:hosts: OK
)Respostas:
Você pode conseguir isso com algum ninja-fu bash adequado. :)
Você conhece o procedimento para calcular um de cada vez:
Edit: como @gertvdijk sugeriu, e lendo as páginas de informações um pouco mais, isso pode ser feito diretamente com tee e Process Substitution suportadas por shells modernos, sem redirecionamentos. Dessa forma, você pode passar seus dados para dois processos e um arquivo usando tee:
Também é possível encadear se você precisar de mais, mas você deve cuidar do STDOUT de todos os subprocessos. Isso NÃO fornecerá o resultado esperado, mas mistura as duas primeiras somas de verificação com os dados em output.txt:
Se você redirecionar as somas de verificação para um arquivo dentro dos processos substituídos, poderá encadeá-las como desejar:
Aqui está minha sugestão inicial sem substituição de processo, mas que permite o encadeamento / uso recursivo sem misturar os dados e a saída:
O truque aqui é usar
tee
, que duplica os dados para STDOUT e um arquivo. Estamos sendo espertos dizendo para gravar os dados no arquivo / proc / self / fd / 2, que sempre é o descritor de arquivos STDERR do processo atual. E com a> >(program)
sintaxe, podemos redirecionar cada descritor de arquivo para o STDIN de um programa, em vez de um arquivo. Assim como|
, mas com mais controle.> >(md5sum)
redireciona STDOUT para omd5sum
programa, enquanto2> >(sha1sum)
redireciona STDERR para osha1sum
programa.Note que a ordem
2>
e>
parece importar, eu tenho que colocar2>
primeiro na linha de comando. Eles são avaliados da direita para a esquerda, mas não sei por que isso faz a 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:
A coisa bacana sobre isso é que você pode realmente recursar e executar várias ao mesmo tempo, não apenas duas. A sintaxe fica peluda, mas isso funciona:
Se você deseja capturar o resultado e usá-lo em um script, isso também funciona:
Agora
$A
é uma sequência que contém toda a saída, incluindo novas linhas. Você também pode analisar os valores posteriormente:Não tenho certeza se você tem alguma garantia em relação à ordenação da saída.
fonte
tee
e o uso inteligente do redirecionamento de saída no shell é o caminho a percorrer. Isso economiza muitos recursos, especialmente ao ler arquivos grandes.Não posso ajudá-lo com a linha de comando, mas eu conheço uma ferramenta GUI chamada quickhash.
Você pode fazer o download dessa ferramenta no Quickhash
Descrição:
fonte
// Script começa daqui
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 '] print' Stop Time :: ', custom_checksum_profile [' stoptime '] print' Processing Time :: ', custom_checksum_profile [' processtime '], exceto TypeError: #' NoneType 'objeto não é subscrito --- basicamente isso deve acontecer quando o não foi possível abrir o arquivo de entrada #raise pass # csv output
fonte