GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Vergleichen Sie md5-Summen im Bash-Skript

Für alle, die hierher kommen und eine Datei mit einer bestimmten md5-Summe vergleichen möchten, können Sie diese Funktion ausprobieren:

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
}

Und dann verwenden Sie es einfach wie:

$ checkmd5 <SOME_MD5_SUM> filepath/file.abc

In dieser Zeile if [ $file1 != $file2 ] , vergleichen Sie nicht den Inhalt zweier Dateien, sondern nur die Dateinamen. Also if [ "md5sum.txt" != "GeoLite2-City.md5" ] wird immer wahr sein.

Das sollte funktionieren:

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

Also ... das Problem, das Sie sehen, scheint das Format von md5sum.txt zu sein Datei, die Sie erstellen, stimmt nicht mit dem Format von .md5 überein herunterzuladende Datei, mit der Sie den berechneten Wert vergleichen müssen.

Das Folgende würde meiner Version des Skripts näher kommen. (Erklärung unten.)

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

Die Hauptunterschiede hier sind..

  • rm -f GeoLightCity.dat statt -rf . Greifen wir nicht weiter als nötig.
  • md5sum nimmt die Standardeingabe, anstatt die Datei nach Namen zu verarbeiten. Der Effekt ist, dass die Ausgabe keinen Dateinamen enthält. Leider aufgrund von Beschränkungen für Linux md5sum Befehl, stimmt dies immer noch nicht mit der .md5-Datei überein, die Sie von Maxmind herunterladen, also:
  • cut wird verwendet, um die resultierende Ausgabe zu modifizieren, wobei nur der berechnete md5 zurückbleibt.
  • mit cmp anstelle von Subshells, pro Kommentar zu Ihrer Frage.

Der zweite und dritte Punkt sind vielleicht die wichtigsten für Sie.

Eine weitere Option zum Erstellen Ihrer md5sum.txt-Datei wäre, dies direkt während des Downloads zu tun. Zum Beispiel:

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

Dies verwendet den tee Befehl, um die Datei in ihren Speicherort und eine weitere Pipe aufzuteilen, die md5sum durchläuft, um Ihre .txt-Datei zu generieren.

Könnte Ihnen eine Minute ersparen, die sonst von der anschließend ausgeführten md5sum aufgezehrt würde. Und es wird SMP besser nutzen. :)


Linux
  1. Kann ein Bash-Skript mit einer Datei verknüpft werden?

  2. Bash-Skript:Prüfen, ob eine Datei eine Textdatei ist?

  3. Ausführen einer Skriptdatei über SSH durch Sudo?

  4. Wie überprüfe ich die Teilzeichenfolge in Shell Script Bash?

  5. Wie man den Alias-Befehl in einem Bash-Skript oder einer Bashrc-Datei zum Laufen bringt

35 Bash-Skriptbeispiele

Woher weiß ich den Namen der Skriptdatei in einem Bash-Skript?

Wie kann man Bash-Skripte in Vim hervorheben?

Bash-Skript fügt Text an die erste Zeile einer Datei an

Bash-Skript zum Entfernen der ältesten Datei aus einem Ordner

Wie man in einem Bash-Skript nach Unicode sucht