GNU/Linux >> Linux Esercitazione >  >> Linux

Confronta le somme md5 nello script bash

Per chiunque venga qui cercando di confrontare un file con una specifica somma md5, puoi provare questa funzione:

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
}

E poi usalo come:

$ checkmd5 <SOME_MD5_SUM> filepath/file.abc

In quella riga if [ $file1 != $file2 ] , non stai confrontando il contenuto di due file, ma solo i nomi dei file. Quindi if [ "md5sum.txt" != "GeoLite2-City.md5" ] sarà sempre vero.

Dovrebbe funzionare:

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

Quindi... il problema che stai riscontrando sembra essere il formato del md5sum.txt il file che crei non corrisponde al formato di .md5 file che scarichi, rispetto al quale devi controllare il valore che calcoli.

Quanto segue sarebbe più vicino alla mia versione della sceneggiatura. (Spiegazione sotto.)

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

Le principali differenze qui sono...

  • rm -f GeoLightCity.dat invece di -rf . Non andiamo oltre il necessario.
  • md5sum accetta l'input standard anziché elaborare il file per nome. L'effetto è che l'output non include un nome file. Sfortunatamente a causa delle limitazioni al md5sum di Linux comando, questo ancora non corrisponde al file .md5 scaricato da Maxmind, quindi:
  • cut viene utilizzato per modificare l'output risultante, lasciando solo il md5 calcolato.
  • usando cmp invece di subshell, per commenti sulla tua domanda.

Il secondo e il terzo punto sono forse i più importanti per te.

Un'altra opzione per creare il tuo file md5sum.txt sarebbe quella di farlo al volo durante il download. Ad esempio:

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

Questo utilizza il tee comando per dividere il file nella sua posizione di "salvataggio" e un'altra pipe, che passa attraverso md5sum per generare il tuo file .txt.

Potrebbe farti risparmiare un minuto che altrimenti verrebbe consumato dalla somma md5 che viene eseguita in seguito. E trarrà maggior vantaggio da SMP. :)


Linux
  1. Uno script Bash può essere agganciato a un file?

  2. Script Bash per rimuovere il file più vecchio da una cartella?

  3. Come far funzionare il comando alias nello script bash o nel file bashrc

  4. Come faccio a conoscere il nome del file di script in uno script Bash?

  5. Reindirizza l'input standard in modo dinamico in uno script bash

35 Esempi di script Bash

Come verificare l'integrità di un file con il checksum md5

Script Bash:pessimo interprete

Come includere un file in uno script di shell bash

Come grep per unicode � in uno script bash

Determina se il filesystem o la partizione è montata RO o RW tramite Bash Script?