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 almd5sum
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. :)