Integridad de ficheros automática SHA-2 (o anteriormente conocido como CRC)
#1
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...n_software

¿Alguna sugerencia?

Gracias!
  Responder
#2
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)
Un saludo

Agur eta ondo ibili

Ganekogorta (TS-469Pro, TVS-673e, QBoat Sunny, TS-453Be, TR-002 y QHora-301w) Ʀɐɯ0η
  Responder
#3
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  Wink


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:
  • la primera vez se crea en el directorio el archivo md5.txt. En su interior la lista de archivos actuales con su md5
  • comprobamos si nos falta un archivo de los que teníamos anteriormente. Envía un correo.
  • comprobamos de los que tenemos si coincide la firma md5 calculada anteriormente con la que hay escrita en el md5. Envía un correo.
  • comprobamos si hay nuevos archivos en el directorio y lo agregamos al md5. Envía un correo.
Al archivo yo lo he llamado md5.sh. Generalmente suelo crear una carpeta llamada "Scripts" en /share/MD0_DATA o en el tipo de volumen que tengamos establecido. Pero es importante que estén dentro de /share para que se mantenga tras los reinicios de la Qnap.
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
Un saludo

Agur eta ondo ibili

Ganekogorta (TS-469Pro, TVS-673e, QBoat Sunny, TS-453Be, TR-002 y QHora-301w) Ʀɐɯ0η
  Responder




Usuarios navegando en este tema: 1 invitado(s)