【问题标题】:creating a file downloading script with checksum verification使用校验和验证创建文件下载脚本
【发布时间】:2011-01-06 09:12:50
【问题描述】:

我想创建一个 shellscript,它从 .diz 文件中读取文件,其中存储了有关各种源文件的信息,这些信息是编译某个软件(在本例中为 imagemagick)所需的。我在这个例子中使用 Mac OSX Leopard 10.5。

基本上,我希望有一种简单的方法来维护这些 .diz 文件,这些文件包含最新源包的信息。我只需要用 url、版本信息和文件校验和更新这些 .diz 文件。

示例行:

libpng:1.2.42:libpng-1.2.42.tar.bz2?use_mirror=biznetnetworks:http://downloads.sourceforge.net/project/libpng/00-libpng-stable/1.2.42/libpng-1.2.42.tar.bz2?use_mirror=biznetnetworks:9a5cbe9798927fdf528f3186a8840ebe

脚本部分:

while IFS=: read app version file url md5
do 
  echo "Downloading $app Version: $version"
  curl -L -v -O $url 2>> logfile.txt
  $calculated_md5=`/sbin/md5 $file | /usr/bin/cut -f 2 -d "="`
  echo $calculated_md5    
done < "files.diz"

其实我有不止一个问题。

  1. 如何计算和比较校验和最好?我想将 md5 校验和存储在 .diz 文件中,并将其与字符串比较与“剪切”字符串进行比较
  2. 有没有办法告诉 curl 另一个文件名来保存? (在我的情况下,文件名变得丑陋 libpng-1.2.42.tar.bz2?use_mirror=biznetnetworks)
  3. 我似乎对应该引导管道 md5 的输出并切入变量 $calculated_md5 的反引号有问题。语法错了吗?

谢谢!

【问题讨论】:

    标签: bash curl shell checksum backticks


    【解决方案1】:
    while IFS=: read app version file url md5
    do
      echo "Downloading $app Version: $version"
      #use -o for output file. define $outputfile yourself
      curl -L -v  $url -o $outputfile 2>> logfile.txt
      # use $(..) instead of backticks.
      calculated_md5=$(/sbin/md5 "$file" | /usr/bin/cut -f 2 -d "=")
      # compare md5
      case "$calculated_md5" in
        "$md5" )
          echo "md5 ok"
          echo "do something else here";;
      esac
    done < "files.diz"
    

    【讨论】:

    • 太棒了!感谢您的快速答复!除了第 11 行的错字(2 个“;”字符),一切似乎都正常!我还必须将分隔符更改为“;”因为“:”当然也在“http:”中。非常感谢!
    • 那个 2 ";" case/esac 中的字符有效。
    • 唯一奇怪的是,curl -o 开关似乎根本不起作用!亲眼看看: curl -L -v -O downloads.sourceforge.net/project/libpng/00-libpng-stable/… -o libpng.tar.bz2 - 有什么想法吗?
    • 奇怪的是,bash 不允许我运行带有 2 ";" 的脚本字符:意外标记 `"do something else here"' 附近的语法错误 - 你确定它是正确的吗?
    • 因为你有 -O 开关。删除它,应该没问题。检查手册页以了解 -O 开关的作用。
    【解决方案2】:

    我的curl 有一个-o (--output) 选项来指定输出文件。您对$calculated_md5 的分配也有问题。分配给它时,它的前面不应该有美元符号。我这里没有/sbin/md5,所以我不能对此发表评论。我所拥有的是md5sum。如果你也有它,你可以考虑它作为替代品。特别是,它有一个 --check 选项,该选项可从 md5sum 的文件列表中工作,这可能对您的情况很方便。 HTH。

    【讨论】:

    • 感谢您的回答; osx 没有 md5sum 而是 md5(来自 openssl 包)
    • 此外,-o 开关似乎不适用于 osx (curl 7.16.3) - 请参阅我上面的评论。
    【解决方案3】:

    以下是实用的单行:

    curl -s -L <url> | tee <destination-file> |
    sha256sum -c <(echo "a748a107dd0c6146e7f8a40f9d0fde29e19b3e8234d2de7e522a1fea15048e70  -") ||
    rm -f <destination-file>
    

    将其封装在一个带有 3 个参数的函数中: - 网址 - 目的地 - sha256

    download() {
       curl -s -L $1 | tee $2 | sha256sum -c <(echo "$3  -") || rm -f $2
    }
    

    【讨论】:

    • 这拯救了我的一天!巧妙地使用tee 并在那里进行进程替换。
    猜你喜欢
    • 2021-10-01
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    • 2022-10-18
    相关资源
    最近更新 更多