比较bash脚本中的md5和

我试图用md5sum比较bash脚本中的两个文件。

目标是使用一个文件的.md5来检查另一个文件的md5sum 。 我的谷歌search如何以正确的方式做到这一点,并没有告诉我如何做到这一点。 烧掉电子邮件就像你期望的那样工作。 现在我试图让它在失败而不是成功的情况下发送一封电子邮件。

也许列出从.md5文件收到的结果和损坏文件的实际md5sum。 我会解决这个问题,最终,但是这有点令人困惑,因为我试图弄清楚我要去哪里错了。

Shellcheck指出代码看起来不错,但我没有得到我期望得到的结果。

几个StackOverflow链接,我检查了一下,看看是否可以工作:

这里是我的bash脚本的内容,它的原始forms:

 #!/bin/bash cd /home/example/public_html/exampledomain.com/billing/system/ || exit rm -rf 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 -L https://geolite.maxmind.com/download/geoip/database/GeoLite2-City.md5 md5sum GeoLite2-City.dat > md5sum.txt file1="md5sum.txt" file2="GeoLite2-City.md5" if [ "`cat $file1`" != "`cat $file2`" ]; then mail -s "Results of GeoLite Updates" email@address.com <<< "md5sum for GeoLite2-City failed. Please check the md5sum. File may possibly be corrupted." else exit fi 

编辑:

更新了以下代码:

 #!/bin/bash cd /home/example/web/exampledomain/public_html/billing/system/ || exit rm -rf GeoLite* rm -rf md5sum.txt 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 wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-City.md5 md5sum GeoLite2-City.dat > md5sum.txt file1="md5sum.txt" file2="GeoLite2-City.md5" if ! cmp "$file1" "$file2"; then echo "They don't match."; fi 

仍在努力。 越来越接近实际的工作!

以上结果:

 root@example# cat GeoLite2-City.md5 e8c076d6ff83e9a615aedc7d5d1842d7 root@example# md5sum GeoLite2-City.dat e8c076d6ff83e9a615aedc7d5d1842d7 GeoLite2-City.dat root@example# cat md5sum.txt e8c076d6ff83e9a615aedc7d5d1842d7 GeoLite2-City.dat 

编辑2:现在代码如下所示,另外请注意,我删除了GeoLiteCity2和GeoLite,以便每当MaxMind更新其数据库时,我们都会重新下载数据库:

 #!/bin/bash # cd to directory where the MaxMind database is to be downloaded. if ! cd /home/example/public_html/billing/system/; then echo "Can't find work directory" >&2 exit 1 fi # Remove existing files so we start off with a clean set of updated data from Maxmind. rm -f GeoLite* rm -f md5sum.txt # Download databases and if applicable, their md5s. 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 # Create md5sum of the GeoLite2 database. md5sum < GeoLite2-City.dat > md5sum.txt # Strip out the spurious - seen in md5sum.txt sed -i 's/ .*//' md5sum.txt # Set what files are what for file comparison purposes. file1="md5sum.txt" file2="GeoLite2-City.md5" # DO THE THING! ie, compare! if ! cmp --silent "$file1" "$file2"; then mail -s "Results of GeoLite Updates" example@domain.com <<< "md5sum for GeoLite2-City failed. Please check the md5sum. File may possibly be corrupted." fi 

所以..你看到的问题似乎是你创建的.md5文件的格式与你下载的.md5文件的格式不匹配,你需要检查你计算的值。

以下将更接近我的版本的脚本。 (下面的说明)

 #!/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@address.com <<< "md5sum for GeoLite2-City failed. Please check the md5sum. File may possibly be corrupted." fi 

这里的主要区别是..

  • rm -f GeoLightCity.dat而不是-rf 。 我们不能达到比我们需要的更远的地步。
  • md5sum需要标准输入,而不是按名称处理文件。 结果是输出不包含文件名。 不幸的是,由于Linux md5sum命令的限制,这仍然不符合你从Maxmind下载的.md5文件,所以:
  • cut用于修改结果输出,只留下计算的md5。
  • 使用cmp而不是subshel​​l,每个评论你的问题。

第二点和第三点可能是最重要的。

创建md5sum.txt文件的另一个选择是在下载时即时执行此操作。 例如:

 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 

这使用tee命令将文件分割为“保存”位置和另一个管道,该管道通过md5sum生成.txt文件。

可以节省你一分钟,否则会被以后运行的md5sum所吃掉。 而且它会更好地利用SMP。 🙂

在该行中, if [ $file1 != $file2 ] ,则不会比较两个文件的内容,而仅仅是文件名。 所以if [ "md5sum.txt" != "GeoLite2-City.md5" ]将始终为真。

这应该工作:

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

对于任何人来这里寻找比较文件与特定的MD5总和,你可以尝试这个功能:

 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 } 

然后就像使用它:

 $ checkmd5 <SOME_MD5_SUM> filepath/file.abc