如何比较 bash 脚本中文件的哈希值?

如何比较 bash 脚本中文件的哈希值?

我用来sha256sum检查 bash 脚本中的文件是否已更改。我的想法是首先将其存储在文件sha256sum*.sha256。然后,如果存在,则使用命令sha256使用它进行比较--check。如果哈希值匹配,则继续脚本的其余部分,否则创建新的哈希文件 ( *.sha256) 并用新的哈希文件替换旧的哈希文件。我已经做好了:

x="/home/test.json"

if [[ -s $x.sha256 ]]; then
        sha256sum --check $x.sha256
        #exit 1
        s1=$(sha256sum "$x" > "$x.sha256")
        #exit 1
else
        s1=$(sha256sum "$x" > "$x.sha256")
        echo "sha256 file is created"
fi

但从上面的代码开始,如果 x.sha256 文件不存在,则会创建它。但是如果文件已经可用并且哈希值不匹配,则会抛出错误:

/home/test.json: FAILED
sha256sum: WARNING: 1 computed checksum did NOT match

这是预期的,但在这种情况下我想创建新x.sha256文件并替换旧文件。

谁能告诉我需要进行哪些更改?

提前致谢

答案1

来自评论:

但脚本使用set -Eeo pipefail

set -e如果sha256sum --check以虚假状态退出,则会导致整个脚本失败。为了避免这种情况,请将命令置于任何类型的条件中,例如 run sha256sum --check || true instead

另外,如前所述,s1=$(sha256sum "$x" > "$x.sha256")看起来有点不对劲,因为输出sha256sum被重定向到文件,命令替换没有任何内容可以捕获,并且$s1无论发生什么,最终都会为空。如果您不需要s1,只需删除命令替换,如果您想将 的输出sha256sum放入变量和文件中,请使用类似

s1=$(sha256sum "$x" | tee "$x.sha256")

因此,我会将整个脚本重写为如下所示:

#!/bin/bash

set -e
file="/home/test.json"

if [[ -s $file.sha256 ]]; then
    if ! sha256sum --check "$file.sha256"; then
        echo "stored hash for '$file' does not match existing file, storing new hash"
        sha256sum "$file" > "$file.sha256"
    else
        : # hash file exists and matches existing file, do nothing
    fi
else
    echo "no stored hash for '$file', creating hash file"
    sha256sum "$file" > "$file.sha256"
fi

也就是说,除非您需要文件中进一步的哈希副本,在这种情况下,还需要读入现有匹配哈希的分支"$file.sha256"

但如果您正在使用set -e,请参阅BashFAQ/105 -- 为什么 set -e (或 set -o errexit 或 trap ERR)没有达到我的预期?

相关内容