编写比较 BATCH 文件以验证 sha256sum 是不是为已发布的代码

Posted

技术标签:

【中文标题】编写比较 BATCH 文件以验证 sha256sum 是不是为已发布的代码【英文标题】:Writing a comparison BATCH file to verify sha256sum to released code编写比较 BATCH 文件以验证 sha256sum 是否为已发布的代码 【发布时间】:2022-01-18 00:06:32 【问题描述】:

尝试编写一个带有 2 个参数($1 和 $2)的脚本,其中一个代表 $hash 和 $file_name。

我正在尝试利用jq 来解析下载所需的数据并比较PASS 或FAIL。

我发现自己无法思考这个问题。

这是我的代码

#!/usr/bin/env sh
#
# Sifchain shasum check (revised).
#

# $1
hash_url=$( curl -R -s https://api.github.com/repos/Sifchain/sifnode/releases | jq '.[] | select(.name=="v0.10.0-rc.4")' | jq '.assets[]' | jq 'select(.name=="sifnoded-v0.10.0-rc.4-linux-amd64.zip.sha256")' | jq '.browser_download_url' | xargs $1 $2 )
echo $hash_url
# $2
hash=$( curl -s -L $hash_url | jq'.$2')

file_name=$(curl -R -s https://api.github.com/repos/Sifchain/sifnode/releases | jq '.[] | .name')



#
#
echo $hash | sha256sum
echo $file_name | sha256sum #null why?
echo "\n"
## version of the release $1,     and the hash $2
## sha256 <expected_sha_256_sum> <name_of_the_file>
sha256() 
  if echo "$1  $2" #| sha256sum -c --quiet
  then
    echo pass $1 $2
    exit 0
  else
    echo FAIL $1 $2
    exit 1
  fi


# Invoke sha256
sha256 $hash_url $file_name

理想情况下,这应该适用于任何哈希与正确文件的比较,在调用 BASH 脚本时提取 2 个参数。

【问题讨论】:

jq'.$2' 对我来说看起来不正确。你是说jq ".$2" 吗? 我认为你是对的,单引号和双引号总是抛出我。 curl -R -s https://api.github.com/repos/Sifchain/sifnode/releases | jq '.[] | .name' 返回多个名称。 【参考方案1】:

我可以建议以下更正/修改:

#!/bin/bash

#sha file

SHA_URL=$(curl -R -s https://api.github.com/repos/Sifchain/sifnode/releases | \
            jq --arg VERSION v0.10.0-rc.4 -r \
                '.[] | select(.name==$VERSION) | .assets[] | select(.name |test("\\.sha256$")) | .browser_download_url')

SHA_VALUE=$(curl -s -L $SHA_URL| tr 1 2)

FILENAME=$(curl -R -s https://api.github.com/repos/Sifchain/sifnode/releases | \
             jq --arg VERSION v0.10.0-rc.4 -r \
                 '.[] | select(.name==$VERSION) | .assets[]  | select(.content_type =="application/zip") | .name')

#added just for testing, I'm assuming you have the files locally allready
FILEURL=$(curl -R -s https://api.github.com/repos/Sifchain/sifnode/releases | \
             jq --arg VERSION v0.10.0-rc.4 -r \
                 '.[] | select(.name==$VERSION) | .assets[]  | select(.content_type =="application/zip") | .browser_download_url')

wget --quiet $FILEURL -O $FILENAME

echo $SHA_VALUE $FILENAME | sha256sum -c --quiet >/dev/null 2>&1
RESULT=$?
if [ $RESULT -eq 0 ]; then
    echo -n "PASS "
else
    echo -n "FAIL "
fi

echo $SHA_VALUE $FILENAME
exit $RESULT

注意事项:

jq --arg VERSION v0.10.0-rc.4 创建要在脚本中使用的“变量” -r - 原始输出,字符串不被引用 test("\\.sha256$") - 正则表达式,用于搜索通用 sha256,因此您不必硬编码全名 select(.content_type =="application/zip") - 我假设这是您正在搜索的文件 wget 仅用于演示目的,要下载文件,我假设您的机器上已经有了该文件 sha256sum -c --quiet &gt;/dev/null 2&gt;&amp;1 - 重定向到 /dev/null 是必要的,因为如果出现错误,sha256sum 不会安静

【讨论】:

谢谢,@Sorin 这对我很有帮助。

以上是关于编写比较 BATCH 文件以验证 sha256sum 是不是为已发布的代码的主要内容,如果未能解决你的问题,请参考以下文章

windows 查看文件 MD2 MD4 MD5 SHA1 SHA256 SHA384 SHA512码

如何将 powershell 中文件的 SHA256 哈希值与已知值进行比较?附加问题

SHA256_cert_fingerprints 中涉及的参数,用于应用链接验证

pgbouncer 和 scram-sha-256 设置

如何匹配sha256输出

下载文件MD5/SHA256/SHA512完整性做校验