GNU/Linux >> Tutoriels Linux >  >> Linux

Comparer les sommes md5 dans le script bash

Pour tous ceux qui viennent ici et qui cherchent à comparer un fichier à une somme md5 spécifique, vous pouvez essayer cette fonction :

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
}

Et puis utilisez-le simplement comme :

$ checkmd5 <SOME_MD5_SUM> filepath/file.abc

Dans cette ligne if [ $file1 != $file2 ] , vous ne comparez pas le contenu de deux fichiers, mais uniquement les noms de fichiers. Alors if [ "md5sum.txt" != "GeoLite2-City.md5" ] sera toujours vrai.

Cela devrait fonctionner :

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

Donc .. le problème que vous voyez semble être que le format du md5sum.txt le fichier que vous créez ne correspond pas au format du .md5 fichier que vous téléchargez, par rapport auquel vous devez vérifier la valeur que vous calculez.

Ce qui suit serait plus proche de ma version du script. (Explication ci-dessous.)

#!/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

Les principales différences ici sont...

  • rm -f GeoLightCity.dat au lieu de -rf . N'allons pas plus loin que nécessaire.
  • md5sum prend une entrée standard plutôt que de traiter le fichier par son nom. L'effet est que la sortie n'inclut pas de nom de fichier. Malheureusement à cause des limitations de Linux md5sum commande, cela ne correspond toujours pas au fichier .md5 que vous téléchargez depuis Maxmind, donc :
  • cut est utilisé pour modifier la sortie résultante, ne laissant que le md5 calculé.
  • en utilisant cmp au lieu de sous-shells, par commentaires sur votre question.

Les deuxième et troisième points sont peut-être les plus importants pour vous.

Une autre option pour créer votre fichier md5sum.txt serait de le faire à la volée pendant le téléchargement. Par exemple :

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

Cela utilise le tee commande pour diviser le fichier en son emplacement de "sauvegarde" et un autre canal, qui passe par md5sum pour générer votre fichier .txt.

Cela pourrait vous faire gagner une minute qui serait autrement mangée par la somme md5 qui s'exécute ensuite. Et il profitera mieux du SMP. :)


Linux
  1. Pourquoi le script Bash ne reconnaît-il pas les alias ?

  2. Script Bash pour supprimer le fichier le plus ancien d'un dossier ?

  3. Comment vérifier l'intégrité d'un fichier avec la somme de contrôle md5

  4. Comment mettre en surbrillance les scripts Bash dans Vim ?

  5. script bash ajoute du texte à la première ligne d'un fichier

35 exemples de scripts bash

Rediriger dynamiquement l'entrée standard dans un script bash

Script bash :mauvais interpréteur

Comment inclure un fichier dans un script shell bash

Boucle Bash décompressez le script de fichier avec mot de passe

Déterminez si le système de fichiers ou la partition est monté RO ou RW via Bash Script ?