GNU/Linux >> Znalost Linux >  >> Linux

Porovnejte součty md5 v bash skriptu

Pro každého, kdo sem přichází a chce porovnat soubor s konkrétním součtem md5, můžete zkusit tuto funkci:

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
}

A pak to použijte jako:

$ checkmd5 <SOME_MD5_SUM> filepath/file.abc

V tomto řádku if [ $file1 != $file2 ] , neporovnáváte obsah dvou souborů, ale pouze názvy souborů. Takže if [ "md5sum.txt" != "GeoLite2-City.md5" ] bude vždy pravda.

To by mělo fungovat:

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

Takže .. problém, který vidíte, je zřejmě formát md5sum.txt soubor, který vytvoříte, neodpovídá formátu .md5 soubor, který si stáhnete, proti kterému je třeba zkontrolovat hodnotu, kterou vypočítáte.

Následující by bylo blíže mé verzi scénáře. (Vysvětlení níže.)

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

Hlavní rozdíly jsou zde...

  • rm -f GeoLightCity.dat místo -rf . Nedosahujme dál, než potřebujeme.
  • md5sum přebírá standardní vstup místo zpracování souboru podle názvu. Výsledkem je, že výstup neobsahuje název souboru. Bohužel kvůli omezením Linuxu md5sum příkaz, toto stále neodpovídá souboru .md5, který jste stáhli z Maxmind, takže:
  • cut se používá k úpravě výsledného výstupu, přičemž zůstane pouze vypočítaný md5.
  • pomocí cmp namísto podsložek podle komentářů k vaší otázce.

Druhý a třetí bod jsou pro vás možná nejdůležitější.

Další možností pro vytvoření souboru md5sum.txt by bylo udělat to za běhu během stahování. Například:

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

Toto používá tee příkaz k rozdělení souboru do jeho umístění „uložit“ a další roura, která prochází md5sum a vygeneruje váš soubor .txt.

Může vám ušetřit minutu, kterou by jinak sežral součet md5, který běží poté. A bude lépe využívat výhod SMP. :)


Linux
  1. Proč skript Bash nerozpozná aliasy?

  2. Bash Script:Zkontrolujte, zda je soubor textovým souborem?

  3. Jak ověřit integritu souboru pomocí kontrolního součtu md5

  1. Jak poznám název souboru skriptu ve skriptu Bash?

  2. Jak zvýraznit Bash skripty ve Vimu?

  3. Jak zahrnout soubor do skriptu bash shell

  1. bash skript připojí text k prvnímu řádku souboru

  2. Bash smyčka rozbalte skript zaheslovaného souboru

  3. Zjistit, zda je souborový systém nebo oddíl připojen RO nebo RW pomocí skriptu Bash?