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