【问题标题】:How to check the checksum through commandline?如何通过命令行检查校验和?
【发布时间】:2014-03-24 07:07:53
【问题描述】:

我想在我的 UNIX 变体的命令行上做这样的事情

if (shasum httpd-2.4.7.tar.bz2 == 19asdasdasd56462e44d61a093ea57e964cf0af05c0e) echo 'good to go'

我不想写一个单独的脚本文本页面来检查这个。
上面这件事显示语法错误。 但是必须有一种巧妙的方法来解决这个问题?

如何做到这一点?

【问题讨论】:

    标签: bash command-line


    【解决方案1】:
    shasum httpd-2.4.7.tar.bz2 |
      awk '$1=="19asdasdasd56462e44d61a093ea57e964cf0af05c0e"{print"good to go"}'
    

    所以通常你从 shasum 得到这个输出

    19asdasdasd56462e44d61a093ea57e964cf0af05c0e *httpd-2.4.7.ta​​r.bz2

    我的命令的作用是获取第一个字段$1,并将其与 你的字符串。如果字符串匹配,则 awk 打印“good to go”。

    请注意,对于sha-1 以外的任何内容,您都需要指定您的算法。比如sha 256,你可以这样做:

    shasum -a256 httpd-2.4.7.tar.bz2
    

    -a 标志指定算法。

    【讨论】:

    • 对大多数人来说可能很明显,但对于 sha256,请使用 sha256sum。另外,对于像我这样想知道的人:awkawk
    • 还有 sha512sum 用于 SHA-512 算法
    • 也可能对每个人都不是很明显,shashum -a256sha256sum 不是同一命令的不同名称。它们是不同的实用程序,可能会或可能不会出现在您的系统上,具体取决于您的平台。
    【解决方案2】:
    echo "19asdasdasd56462e44d61a093ea57e964cf0af05c0e  httpd-2.4.7.tar.bz2" \
      | shasum -c
    

    【讨论】:

      【解决方案3】:

      我使用上一个/最后一个命令的退出代码:

      如果校验和有效,则最后执行命令的退出代码为0

      > echo "${PROMETHEUS_CHECKSUM} prometheus-${PROMETHEUS_VERSION}.linux-arm64.tar.gz" | sha256sum -c
      > echo $?                                                                                         
      0
      

      如果校验和不正确,则退出代码与0不同

      > export PROMETHEUS_CHECKSUM='some garbage'
      > echo "${PROMETHEUS_CHECKSUM} prometheus-${PROMETHEUS_VERSION}.linux-arm64.tar.gz" | sha256sum -c
      prometheus-2.0.0.linux-arm64.tar.gz: FAILED
      sha256sum: WARNING: 1 computed checksum did NOT match
      > echo $?                                                                                         
      1
      

      这是带有if 语句的整个示例:

      #!/bin/bash
      
      ...
      
      echo "${PROMETHEUS_CHECKSUM} prometheus-${PROMETHEUS_VERSION}.linux-arm64.tar.gz" | sha256sum -c
      
      if [ $? != 0 ]; then
        echo 'Prometheus checksum is not valid'
        exit 1
      fi
      

      【讨论】:

        【解决方案4】:

        简单地使用grep 似乎是最好的方法:

        > shasum httpd-2.4.7.tar.bz2 | grep 19ed9ee56462e44d61a093ea57e964cf0af05c0e
        

        当校验和正确时,校验和会高亮显示:

        当校验和不正确时,什么也没有显示。 如果为您提供大写校验和,请使用grep -i <CHECKSUM>

        【讨论】:

          【解决方案5】:

          尝试类似:

          shasum httpd-2.4.7.tar.bz2 | 
          while read -r sum _ ; do 
            [[ $sum == 19asdasdasd56462e44d61a093ea57e964cf0af05c0e ]] && echo "good" || echo "bad"
          done
          

          test 运算符包含在[ .. ] 中,正确的语法是if; then; fi,但您可以使用&&|| 运算符来模拟它。

          测试:

          <~/temp>$ touch httpd-2.4.7.tar.bz2 
          <~/temp>$ shasum httpd-2.4.7.tar.bz2 | while read -r sum _ ; do [[ $sum == 19asdasdasd56462e44d61a093ea57e964cf0af05c0e ]] && echo "good" || echo "bad"; done
          bad
          <~/temp>$ shasum httpd-2.4.7.tar.bz2 | while read -r sum _ ; do [[ $sum != 19asdasdasd56462e44d61a093ea57e964cf0af05c0e ]] && echo "good" || echo "bad"; done
          good
          <~/temp>$ bash --version
          GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)
          Copyright (C) 2007 Free Software Foundation, Inc.
          

          【讨论】:

          • @user1590011 我为你添加了一个测试输出。
          • 嘿,现在它非常适合我。请说明您是如何做到的。
          • @user1590011 什么都没做! :)。可能你复制的多行代码不正确。
          • 是的,很有可能,但请帮我解决这个-r sum _ 在上面的脚本中所做的事情。
          • 没什么特别的。我们正在将输出读入变量总和。下划线也是一个变量,收集我们不需要的文件名。
          【解决方案6】:

          POSIX 版本

          sha256sum httpd-2.4.7.tar.bz2 | cut -d ' ' -f 1 | grep -xq '^19asdasdasd56462e44d61a093ea57e964cf0af05c0e$'; if test $? -eq 0; then echo "good to go"; fi;
          

          【讨论】:

            【解决方案7】:

            我做了一个 bash 脚本,它可以让人们不必一直思考它:

            https://github.com/dtonhofer/muh_linux_tomfoolery/blob/master/verify_checksum.sh

            检查一下:

            verify_checksum file.tgz [SHA1, SHA256, MD5 checksum]

            ...或者您可以交换参数,因为您再次忘记了文件是先出现还是最后出现:

            verify_checksum [SHA1, SHA256, MD5 checksum] file.tgz

            ...或者您可以计算文件的各种校验和(将它们全部列出):

            verify_checksum file.tgz

            ...或者您可以比较两个文件:

            verify_checkusm file1.tgz file2.tgz

            【讨论】:

              【解决方案8】:

              使用类似的东西

              myhash=$(sha256sum httpd-2.4.7.tar.bz2 | cut -d' ' -f1)
              if [ $myhash = "19asdasdasd56462e44d61a093ea57e964cf0af05c0e" ] ; then echo "foobar" ; fi
              

              解释:sha256sum 产生校验和和文件名,由空格分隔。我们可以cut 它只产生校验和。

              【讨论】:

              • 老兄,我在意外令牌then附近遇到语法错误
              • @user1590011 你确定你在bash中执行这个吗?对我来说,它使用bash 4.2.45(1)
              • 是的,即使在收到错误-bash: syntax error near unexpected token then`` 时,也将整个内容粘贴在一行中
              • 你使用的是什么版本的 bash?
              • GNU bash,版本 3.2.48
              【解决方案9】:

              使用shasum获取hash,然后写test &lt;copy-1&gt; = &lt;copy-2&gt; &amp;&amp; echo a || echo b,如果hash相同你会看到a,否则b

              如果你很懒,你可以删除|| echo b 部分,如果哈希值相同,你会看到a,否则什么都没有。如果你再懒一点,你甚至可以不写 echo 并依赖 command not found 消息的存在与否。

              【讨论】:

                【解决方案10】:

                shasum &lt;file_to_check&gt; | diff &lt;checksum_file&gt; -

                如果您在文件中获取校验和,这可能会更容易一些 在管道的左侧,计算文件的校验和并将其传输到diff 以将其与校验和(由文件作者提供)进行比较。当使用管道 | 时,- 替换 stdin

                【讨论】:

                  【解决方案11】:

                  我只需要这样做,这就是我所做的:

                  s=`shasum myfile.dat`
                  a=( $s )
                  chk=${a[0]}
                  echo "The checksum is [$chk]"
                  

                  对我来说似乎更简单更干净......

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-10-14
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多