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


Mensajes en este tema
Integridad de ficheros automática SHA-2 (o anteriormente conocido como CRC) - por Ganekogorta - 03-02-2019, 09:57 PM



Usuarios navegando en este tema: 1 invitado(s)