GNU/Linux >> Tutoriales Linux >  >> Linux

Compara sumas md5 en script bash

Para cualquiera que venga aquí y busque comparar un archivo con una suma md5 específica, puede probar esta función:

function checkmd5() {
  md5_to_test=$1
  md5_from_file=$(md5sum "$2" | cut -d " " -f1)
  md5_results="Input: $md5_to_test\nFile:  $md5_from_file"
  if [[ $md5_to_test == $md5_from_file ]]
    then
      echo -e "\n\e[92mSUCCESS\e[39m\n$md5_results"
    else
      echo -e "\n\e[91mFAILURE\e[39m\n$md5_results"
  fi
}

Y luego úsalo como:

$ checkmd5 <SOME_MD5_SUM> filepath/file.abc

En esa línea if [ $file1 != $file2 ] , no está comparando el contenido de dos archivos, sino solo los nombres de los archivos. Así que if [ "md5sum.txt" != "GeoLite2-City.md5" ] será siempre cierto.

Eso debería funcionar:

if [ "`awk '{print $1;}' $file1`" != "`cat $file2`" ]; then
...do your logic here...
fi

Entonces... el problema que estás viendo parece ser que el formato del md5sum.txt el archivo que creas no coincide con el formato del .md5 archivo que descarga, contra el cual debe verificar el valor que calcula.

Lo siguiente estaría más cerca de mi versión del guión. (Explicación a continuación).

#!/bin/bash

if ! cd /home/example/public_html/exampledomain.com/billing/system/; then
  echo "Can't find work directory" >&2
  exit 1
fi

rm -f GeoLiteCity.dat

curl -L https://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz | gunzip > GeoLiteCity.dat
curl -L https://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz | gunzip > GeoLite2-City.dat
curl -O https://geolite.maxmind.com/download/geoip/database/GeoLite2-City.md5
md5sum < GeoLite2-City.dat | cut -d\  -f1 > md5sum.txt

file1="md5sum.txt"
file2="GeoLite2-City.md5"

if ! cmp --silent "$file1" "$file2"; then
  mail -s "Results of GeoLite Updates" [email protected] <<< "md5sum for GeoLite2-City failed. Please check the md5sum. File may possibly be corrupted."
fi

Las principales diferencias aquí son...

  • rm -f GeoLightCity.dat en lugar de -rf . No lleguemos más lejos de lo necesario.
  • md5sum toma la entrada estándar en lugar de procesar el archivo por nombre. El efecto es que la salida no incluye un nombre de archivo. Lamentablemente, debido a las limitaciones de Linux md5sum comando, esto todavía no coincide con el archivo .md5 que descargaste de Maxmind, así que:
  • cut se usa para modificar la salida resultante, dejando solo el md5 calculado.
  • usando cmp en lugar de subcapas, según los comentarios sobre su pregunta.

El segundo y tercer punto son quizás los más importantes para ti.

Otra opción para crear su archivo md5sum.txt sería hacerlo sobre la marcha mientras lo descarga. Por ejemplo:

curl -L https://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz \
| gunzip | tee -a GeoLite2-City.dat | cut -d\  -f1 | md5sum > md5sum.txt

Esto usa el tee comando para dividir el archivo en su ubicación "guardar" y otra canalización, que pasa por md5sum para generar su archivo .txt.

Podría ahorrarle un minuto que, de lo contrario, sería devorado por el md5sum que se ejecuta después. Y aprovechará mejor SMP. :)


Linux
  1. ¿Se puede conectar un script Bash a un archivo?

  2. Bash Script:¿Comprobar si un archivo es un archivo de texto?

  3. ¿Cómo verificar la subcadena en Shell Script Bash?

  4. Cómo hacer que el comando de alias funcione en script bash o archivo bashrc

  5. ¿Cómo sé el nombre del archivo de script en un script Bash?

35 ejemplos de secuencias de comandos Bash

Cómo verificar la integridad de un archivo con md5 checksum

Bash script:mal intérprete

Cómo incluir un archivo en un script de shell bash

Bash script para eliminar el archivo más antiguo de una carpeta

Cómo hacer grep para Unicode en un script bash