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" example@unixlinux.online <<< "md5sum for GeoLite2-City failed. Please check the md5sum. File may possibly be corrupted."
fi
Las principales diferencias aquí son...
rm -f GeoLightCity.daten lugar de-rf. No lleguemos más lejos de lo necesario.md5sumtoma 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 Linuxmd5sumcomando, esto todavía no coincide con el archivo .md5 que descargaste de Maxmind, así que:cutse usa para modificar la salida resultante, dejando solo el md5 calculado.- usando
cmpen 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. :)