Integridad de ficheros automática SHA-2 (o anteriormente conocido como CRC) - Versión para impresión +- Foro QNAP en español (https://www.qnapclub.es) +-- Foro: GENERAL (https://www.qnapclub.es/forumdisplay.php?fid=3) +--- Foro: Firmware, Aplicaciones y Tutoriales (https://www.qnapclub.es/forumdisplay.php?fid=39) +--- Tema: Integridad de ficheros automática SHA-2 (o anteriormente conocido como CRC) (/showthread.php?tid=2696) |
Integridad de ficheros automática SHA-2 (o anteriormente conocido como CRC) - onetx - 30-01-2019 Hola, Hace no mucho he tenido un problema al ver lo videos de un viaje y descubrir con sorpresa que estaban corruptos. Se ve que con el tiempo, copiandolos entre diferentes dispositivos (discos duros externos, Nas, ...) el fichero en algún momento se corrompio y hasta hoy no he detectado el problema. Estoy buscando alguna herramienta que pueda utilizar en el Nas para generar ficheros de comprobación (checksum) en SHA-512 y que periodicamente se comprueben y así detectar el problema cuanto antes para restaurar backups. He visto que en Wikipedia hay una lista interminable, pero son su mayoria aplicaciones para PC y busco algo más enfocado en el NAS. https://en.wikipedia.org/wiki/Comparison_of_file_verification_software ¿Alguna sugerencia? Gracias! Integridad de ficheros automática SHA-2 (o anteriormente conocido como CRC) - Ganekogorta - 31-01-2019 Hola Se me ocurre crear un script que haga lo siguiente: -La primera vez que lo ejecutas crea en ese directorio un archivo que en su interior contiene líneas con el md5 y el nombre del archivo -las siguientes veces al existir el archivo con los md5 ha de leer línea a línea y comparar el md5 escrito con el que calcula de nuevo. Si hay diferencias que te envié un correo indicándolo. Pero hay varias casuísticas. Si añadimos un archivo nuevo, el script ha de comprobar los existentes y agregar la nueva línea del nuevo archivo. Si eliminamos un archivo del directorio, el script avisaría por correo del archivo desaparecido y modificar el archivo de resultados eliminando esa línea del archivo eliminado. El script habría que programarlo para que cada x horas se compruebe... por ejemplo una vez al día. Ya que calcular md5 de archivos grandes (vídeos) es pesado y lento por el tamaño del archivo. Estoy dándole vueltas a la cabeza por si me dejo algo. Si puedo el fin de semana, pongo como lo haría yo. Un saludo Agur eta ondo ibilli Mon (TS-469Pro, TVS-673, QBoat Sunny y TS-453Be) Integridad de ficheros automática SHA-2 (o anteriormente conocido como CRC) - Ganekogorta - 03-02-2019 Hola A ver que te parece el script siguiente. No está muy depurado pero te puede servir de guía y es funcional. Si alguno quiere optimizarlo y mejorarlo... que lo escriba por aquí que lo mío no es bash Como primeros parámetros le damos la ruta absoluta de la carpeta a comprobar y las direcciones de correo del remitente y destinatario para dar los avisos pertinentes. Comentabas que eran películas, así que entiendo que NO hay subdirectorios y no hay una gran actividad diaria de cambios. El funcionamiento es básicamente el siguiente:
Este archivo debemos añadirlo al programador de tareas (Cron ) Si por ejemplo queremos que el archivo /share/MD0_DATA/Scripts/md5.sh se ejecute a las 01:00 los pasos son: echo -e "00 1 * * * /share/MD0_DATA/Scripts/md5.sh">> /mnt/HDA_ROOT/.config/crontab crontab /etc/config/crontab #! /bin/bash ruta="/share/MD0_DATA/Public" destino="correo1@hotmail.com" remite="correo2@hotmail.com" # compruebo si ya existe el archivo MD5.txt anterior if [ -f $ruta/md5.txt ]; then #existe md5.txt # leo las líneas y busco archivo en md5.txt para luego comparar while IFS= read -r linea || [[ -n "$linea" ]]; do md5="${linea:0:32}"; archivo="${linea:33:200}"; # echo "${archivo} ${md5}" ; if [ ! -f $archivo ]; then #echo "FALTA el archivo $archivo" # envío un archivo avisando de que falta el $archivo en el directorio # si falta n archivo, enviará n correos. Esto es mejorable echo "Subject: Falta un archivo" > correo.txt echo "From: $origen" >> correo.txt echo "To: $destino" >> correo.txt echo "Falta el archivo $archivo respecto a la ultima comprobacion de MD5" >> correo.txt echo "nombre = $archivo" >> correo.txt echo "MD5 = $md5" >> correo.txt cat correo.txt | /usr/sbin/sendmail -t recalculo=1 fi done < $ruta/md5.txt #compruebo si hay algun archivo nuevo #obtengo lista de archivo que hay actualmente ls $ruta -p |grep -v / | grep -v md5.txt > archivosahora.txt while IFS1= read -r linea1 || [[ -n "$linea1" ]]; do let existef=0 while IFS= read -r linea || [[ -n "$linea" ]]; do archivo="${linea:33:200}"; var="$ruta/$linea1" #echo "$ruta/md5.txt" "$var" if [ $var = $archivo ]; then #existe el $archivo en el directorio y en md5 #comparo los MD5 para ver si hay cambios #echo md5 guardado= "${linea:0:32}" md5a=$(md5sum $var) if [ "${linea:0:32}" != "${md5a:0:32}" ]; then echo "Son diferentes $archivo" echo "Subject: Un archivo ha cambiado de contenido" > correo.txt echo "From: $origen" >> correo.txt echo "To: $destino" >> correo.txt echo "El $archivo ha cambiado respecto a la ultima comprobacion de MD5" >> correo.txt echo "nombre = $archivo" >> correo.txt echo "MD5 original= ${linea:0:32}" >> correo.txt echo "MD5 actual= ${md5a:0:32}" >> correo.txt cat correo.txt | /usr/sbin/sendmail -t recalculo=1 fi let existef=1 fi done < $ruta/md5.txt if [ $existef -eq 0 ]; then #echo "$linea1 es nuevo y lo añado a md5.txt" md5sum $var >> $ruta/md5.txt #envío el correo con el aviso echo "Subject: Nuevo archivo en el directorio" > correo.txt echo "From: $origen" >> correo.txt echo "To: $destino" >> correo.txt echo "Hay un nuevo archivo $linea1 respecto a la ultima comprobacion de MD5" >> correo.txt echo "nombre = $ruta/$linea1" >> correo.txt cat correo.txt | /usr/sbin/sendmail -t let existef=0 recalculo=1 fi done < archivosahora.txt rm archivosahora.txt if [ -f correo.txt ]; then rm correo.txt fi #Si hay nuevos recalculo md5.txt #mejorable calculando solo el nuevo md5 y añadiendo solo en nuevo al archivo md5.txt if [ "$recalculo" = "1" ]; then #echo "recalculo MD5 porque hay nuevo o falta algún archivo" for file in $ruta/*; do md5sum $file; done > $ruta/md5.txt fi else # Creo el archivo MD5.txt por primera vez for file in $ruta/*; do md5sum $file; done > $ruta/md5.txt fi |