7 votos

¿Cómo buscar un archivo por un valor hash con un script de bash (terminal)?

Estoy escribiendo un script para Mac OS X Lion 10.7 y me gustaría saber cómo puedo buscar archivos basados en sus hashes SHA1. Me gustaría buscar en todo el sistema de archivos el(los) archivo(s) que estaré buscando.

Por ejemplo, el valor SHA1 0d882ff2d5edd7d045c1b57320d2e046793868f8 corresponde al archivo MacOSXUpdCombo10.7.2.dmg ¿Cómo puedo buscar en el disco duro el archivo con su valor SHA1 sin necesidad de comparar el archivo?

10voto

jtbandes Puntos 8260

Puedes usar el comando find:

find / -type f -exec sha1sum {} \; | grep 0d882ff2d5edd7d045c1b57320d2e046793868f8

Sin embargo, dado que estás ejecutando esto en todos los archivos, puede ser extremadamente lento; intenta limitar el directorio de búsqueda reemplazando / con la ruta hacia un directorio específico que desees buscar.

0 votos

Necesitarás preceder eso con sudo si quieres que el comando find llegue a áreas del sistema de archivos normalmente fuera del alcance de los usuarios regulares.

1 votos

@BryanLarson si esta respuesta resolvió tu pregunta, deberías hacer clic en la marca de verificación debajo del recuento de votos a la izquierda para aceptar aún.

0 votos

El md5 fallará al coincidir con un hash sha1.

1voto

Rich Puntos 2429

Aquí hay algunas líneas de comando que pueden ayudar a encontrar un archivo a partir de su digest SHA1. Digamos que el archivo que estamos buscando es MacOSXUpdCombo10.7.2.dmg.

# almacenar el tamaño del archivo buscado
size=`/bin/ls -l MacOSXUpdCombo10.7.2.dmg | awk '{print $5}'`
# almacenar el digest del archivo buscado
sha1=`/usr/bin/openssl sha1 MacOSXUpdCombo10.7.2.dmg | awk '{print $2}'`
/usr/bin/sudo find / -type f -size ${size} -exec /usr/bin/openssl sha1 {} \; |
    grep ${sha1}

Este find se ejecutará en archivos simples y no directorios, sockets o archivos especiales. También se ejecutará solo en archivos del tamaño correcto, evitando así hacer un digest del Kernel o de tu biblioteca de iTunes y de un montón de pequeños archivos temporales.

Si estás seguro de que el nombre del archivo incluye la extensión correcta, este find podría ser acelerado aún más con la siguiente lista de argumentos:

/usr/bin/sudo find / -type f -name "*.dmg" -size ${size} -exec /usr/bin/openssl sha1 {} \; |
    grep ${sha1}

1voto

WeasleyWaali Puntos 6

También puedes intentar usar xargs dependiendo de cuántos archivos estés buscando.

find / -type f |
    xargs -I {} openssl sha1 {} | 
    grep 0d882ff2d5edd7d045c1b57320d2e046793868f8

0 votos

openssl seguirá siendo llamado una vez por archivo gracias a la opción -I de xargs, por lo que no habrá ninguna ganancia.

0 votos

Mis disculpas, tienes razón, he editado mi declaración original.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X