¡Descarga las sumas de verificación md5 y sha1 con un solo comando!
9
Estoy buscando comandos o utilidades para calcular md5 , sha1 hash value por un comando.
En este momento Ubuntu tiene sha1sumy md5sumcomandos para el cálculo de hashvalor.
Porqué lo quieres? Por lo general, desea poder verificar hashes después de generarlos. Por ejemplo, para generar un hash: md5sum hosts. Entonces, para verificar este resultado: echo "b9adfb2e2022a3a84ba06b55eeb2dc64 hosts" | md5sum --check(debe dar: hosts: OK)
Lekensteyn
2
supongamos que si desea calcular el 'valor hash' de un disco duro de 500 GB, es decir, sha1 y md5. Si calculo uno por uno (usando sha1sum y md5sum) tomaría el doble de tiempo. pero si pudiera hacerse con utilidades únicas iguales al software de Windows, entonces sería mi respuesta deseada.
MS Parmar
Respuestas:
9
Puede lograr esto con algunos bash ninja-fu adecuados. :)
Conoces el procedimiento para calcular uno a la vez:
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:
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 md5sumprograma, mientras que 2> >(sha1sum)redirige STDERR al sha1sumprograma.
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 $Aes una cadena que contiene toda la salida, incluidas las nuevas líneas. También puede analizar los valores más adelante:
+1. teey 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.
gertvdijk
2
Por cierto, creo que no es necesario redirigir a stderr para duplicar la salida de la transmisión. El uso de una subshell también hará el truco, manteniendo stderr. Vea mi ejemplo aquí en una publicación de blog .
gertvdijk
@gertvdijk Correcto, la sustitución del proceso es más limpia y más fácil de encadenar (no es necesario recurrir). Actualizaré mi respuesta.
ketil
Agradable. Te daría otro voto positivo si pudiera. :-)
gertvdijk
Si bien estos funcionan bien para archivos pequeños agradables, está duplicando los esfuerzos y el tiempo de procesamiento para archivos más grandes que estoy tratando de evitar ...
EkriirkE
3
No puedo ayudarte con la línea de comandos, pero conozco una herramienta GUI llamada quickhash.
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
)Respuestas:
Puede lograr esto con algunos bash ninja-fu adecuados. :)
Conoces el procedimiento para calcular uno a la vez:
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:
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:
Si redirige las sumas de verificación a un archivo dentro de los procesos sustituidos, puede encadenarlas como desee:
Aquí está mi sugerencia inicial sin sustitución del proceso, pero que permite el uso encadenado / recursivo sin mezclar los datos y la salida:
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 almd5sum
programa, mientras que2> >(sha1sum)
redirige STDERR alsha1sum
programa.Tenga en cuenta que el orden de
2>
y>
parece importar, tengo que poner2>
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:
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:
Si desea capturar el resultado y usarlo en un script, eso también funciona:
Ahora
$A
es una cadena que contiene toda la salida, incluidas las nuevas líneas. También puede analizar los valores más adelante:Sin embargo, no estoy seguro de que tenga garantías con respecto al pedido de la salida.
fuente
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:
fuente
// El script comienza desde aquí
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
fuente