Estoy buscando comandos o utilidades para calcular md5 , sha1 hash value por un comando.
En este momento Ubuntu tiene sha1sum
y md5sum
comandos para el cálculo de hash
valor.
Estoy buscando comandos o utilidades para calcular md5 , sha1 hash value por un comando.
En este momento Ubuntu tiene sha1sum
y md5sum
comandos para el cálculo de hash
valor.
Respuestas:
Puede lograr esto con algunos bash ninja-fu adecuados. :)
Conoces el procedimiento para calcular uno a la vez:
$ echo abc | md5sum
0bee89b07a248e27c83fc3d5951213c1 -
$ echo abc | sha1sum
03cfd743661f07975fa2f1220c5194cbaff48451 -
Editar: como sugirió @gertvdijk, y leer un poco más las páginas de información, esto se puede hacer directamente con tee y Process Substitution respaldados por shells modernos, sin redireccionamientos. De esta manera, puede pasar sus datos a dos procesos y un archivo usando tee:
$ echo abc | tee >(md5sum) >(sha1sum) > output.txt
También es posible encadenar si necesita más, pero debe cuidar STDOUT de todos los subprocesos. Esto NO le dará el resultado esperado, pero mezcla las dos primeras sumas de verificación junto con los datos en output.txt:
$ echo abc | tee >(md5sum) >(sha1sum) | tee >(sha256sum) >(sha512sum) > output.txt
Si redirige las sumas de verificación a un archivo dentro de los procesos sustituidos, puede encadenarlas como desee:
$ echo abc | tee >(md5sum > /tmp/md5.txt) >(sha1sum > /tmp/sha1.txt) | tee >(sha256sum > /tmp/sha256.txt) >(sha512sum > /tmp/sha512.txt) > output.txt
Aquí está mi sugerencia inicial sin sustitución del proceso, pero que permite el uso encadenado / recursivo sin mezclar los datos y la salida:
$ echo abc | tee -a /proc/self/fd/2 2> >(sha1sum) > >(md5sum)
0bee89b07a248e27c83fc3d5951213c1 -
03cfd743661f07975fa2f1220c5194cbaff48451 -
El truco aquí es usar tee
, que duplica los datos a STDOUT y un archivo. Estamos siendo inteligentes diciéndole que escriba los datos en el archivo / proc / self / fd / 2, que siempre es el descriptor de archivo STDERR del proceso actual. Y con la > >(program)
sintaxis podemos redirigir cada descriptor de archivo al STDIN de un programa en lugar de un archivo. Al igual que |
, pero con más control. > >(md5sum)
redirige STDOUT al md5sum
programa, mientras que 2> >(sha1sum)
redirige STDERR al sha1sum
programa.
Tenga en cuenta que el orden de 2>
y >
parece importar, tengo que poner 2>
primero en la línea de comando. Estos se evalúan de derecha a izquierda, pero no estoy seguro de por qué esto hace la diferencia.
Para hacer esto en un archivo o disco duro, debe reemplazar "echo abc" con un gato o un dd, por ejemplo:
dd if=/dev/sda bs=8k | tee -a /proc/self/fd/2 2> >(sha1sum) > >(md5sum)
Lo ingenioso de esto es que en realidad puede recurrir y ejecutar varios al mismo tiempo, no solo dos. La sintaxis se vuelve peluda, pero esto funciona:
echo abc | tee -a /proc/self/fd/2 2> >(tee -a /proc/self/fd/2 2> >(sha256sum) > >(sha384sum) ) > >(sha512sum)
Si desea capturar el resultado y usarlo en un script, eso también funciona:
A=$(echo abc | tee -a /proc/self/fd/2 2> >(sha1sum) > >(md5sum))
Ahora $A
es una cadena que contiene toda la salida, incluidas las nuevas líneas. También puede analizar los valores más adelante:
echo "checksum=[$(echo "$A" | head -1 | cut -d " " -f 1)]"
Sin embargo, no estoy seguro de que tenga garantías con respecto al pedido de la salida.
tee
y el uso inteligente de la redirección de salida en el shell es el camino a seguir. Esto ahorra muchos recursos, especialmente al leer archivos grandes.
No puedo ayudarte con la línea de comandos, pero conozco una herramienta GUI llamada quickhash.
Puede descargar esa herramienta desde Quickhash
Descripción:
Una GUI de Linux y Windows para permitir la selección rápida y el posterior hash de archivos (individual o recursivamente a través de una estructura de carpetas) de texto y (en Linux) discos. Diseñado para Linux, pero también disponible para Windows. MD5, SHA1, SHA256, SHA512 disponibles. Salida copiada al portapapeles o guardada como archivo 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.
// El script comienza desde aquí
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_1ofile [ '] print' Stop Time :: ', custom_checksum_profile [' stoptime '] print' Processing Time :: ', custom_checksum_profile [' processtime '] excepto TypeError: # El objeto' NoneType 'no es subscriptable --- básicamente esto debería suceder cuando el el archivo de entrada no se pudo abrir #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
. Entonces, para verificar este resultado:echo "b9adfb2e2022a3a84ba06b55eeb2dc64 hosts" | md5sum --check
(debe dar:hosts: OK
)