如何验证Zip文件夹的SHA512校验和与对应.sha512文件匹配?
正确验证SHA512校验和的方法
你的脚本问题在于直接比较两个文件本身(-ne是判断两个文件是否为不同的实体),而不是计算file.zip的SHA512哈希值并和file.sha512里存储的校验和做对比。下面是两种可靠的校验方法:
方法一:用sha512sum直接验证(推荐)
sha512sum工具自带校验功能,能自动读取.sha512文件里的校验和条目,和目标文件的哈希值做对比:
if sha512sum --check file.sha512; then echo "Checksum values match" # 可在此添加校验通过后的后续逻辑 else echo "Checksum values do not match" >&2 exit 1 fi
细节说明:
sha512sum --check file.sha512会自动解析文件内的格式(通常是哈希值 文件名或哈希值 *文件名),完成校验- 校验通过时命令返回0(成功状态),失败时返回非0值
>&2把错误信息输出到标准错误流,符合脚本的规范输出习惯
方法二:手动计算并对比哈希值
如果你想完全手动控制校验流程,可以先计算目标文件的哈希,再读取.sha512文件的内容做对比:
# 计算zip文件的SHA512哈希,仅保留哈希部分(剔除文件名) calculated_hash=$(sha512sum file.zip | awk '{print $1}') # 从.sha512文件中提取预期的哈希值(假设文件仅含对应file.zip的条目) expected_hash=$(awk '{print $1}' file.sha512) # 对比两个哈希值 if [[ "$calculated_hash" == "$expected_hash" ]]; then echo "Checksum values match" else echo "Checksum values do not match" >&2 exit 1 fi
注意事项:
- 如果
.sha512文件包含多个校验和条目,需要先过滤出对应file.zip的行,比如用grep file.zip file.sha512 | awk '{print $1}'提取哈希 - 确保
.sha512文件的格式正确,避免因多余空格或换行导致提取错误
原脚本的错误点回顾
你原来的[[ file.zip -ne file.sha512 ]]是在判断两个文件是否为不同的磁盘实体(比如inode编号不同),这和校验和验证完全无关——不管哈希值是否匹配,这个判断都会输出"不匹配"的错误信息,这是核心问题所在。
内容的提问来源于stack exchange,提问作者whatthefish




