sha256sum -c SHA256SUMS 会检查校验和文件里列出的每个文件,逐个打印 OK 或 FAILED——不用拿眼睛去比对十六进制串。这能证明文件完整下载了,但不能证明这个发行版是真的:那要靠校验和文件本身的签名。
1. 检查下载到的全部文件
$ clai 校验已下载文件的校验和→ sha256sum -c SHA256SUMSapp-1.2.0-darwin-arm64.tar.gz: OKapp-1.2.0-linux-amd64.tar.gz: OKapp-1.2.0-linux-arm64.tar.gz: OK
SHA256SUMS 就是一个普通文本文件,每行是"哈希、两个空格、文件名",项目会把它放在发行文件旁边。-c 自己完成比对,这正是它存在的意义。
2. 只下载了其中一个文件
$ clai 只校验我手上有的那个文件→ sha256sum -c --ignore-missing SHA256SUMSapp-1.2.0-linux-amd64.tar.gz: OK
不加 --ignore-missing 时,它会对每个缺失文件报 FAILED open or read 并以 1 退出,尽管你那个文件毫无问题。这是"校验没通过"这个误会最常见的来源。
3. 真正失败长什么样
$ clai 下载中断后校验这个文件→ sha256sum -c --ignore-missing SHA256SUMSapp-1.2.0-linux-amd64.tar.gz: FAILEDsha256sum: WARNING: 1 computed checksum did NOT matchsha256sum: SHA256SUMS: no file was verified
通过翻转压缩包里的一个字节验证过。退出码是 1,脚本该看的就是它。FAILED 表示"文件不对",FAILED open or read 表示"没有这个文件",是两回事。
4. 只有一个哈希,没有校验和文件
$ clai 用下载页上的哈希核对这个文件→ echo "<hash> app-1.2.0-linux-arm64.tar.gz" | sha256sum -c -app-1.2.0-linux-arm64.tar.gz: OK
哈希和文件名之间的两个空格是格式的一部分,不是排版。当网站只给出单个哈希而没有校验和文件时,就这么核对。
5. 签名比哈希更重要
$ clai 校验校验和文件的签名→ gpg --verify SHA256SUMS.asc SHA256SUMSgpg: Signature made Thu Aug 27 23:09:38 2026 +07gpg: using EDDSA key CDDC16ABE7FBF699F0CA9D6C7CA6166B006AB9B0gpg: Good signature from "App Releases <[email protected]>" [ultimate]
这是大多数教程跳过的部分。哈希证明字节完整到达,并不证明这个发行版出自作者之手:同时替换压缩包和 SHA256SUMS 的攻击者,照样能让哈希对上。签名撑不住这种替换——把校验和文件改一个字符,gpg 就回答 BAD signature from "App Releases <releases@example.com>",已验证。
6. 手上没有那把公钥时
$ clai 在没有项目公钥的情况下校验签名→ gpg --verify SHA256SUMS.asc SHA256SUMSgpg: Signature made Thu Aug 27 23:09:38 2026 +07gpg: using EDDSA key CDDC16ABE7FBF699F0CA9D6C7CA6166B006AB9B0gpg: Can't check signature: No public key
这不是"签名有问题",而是"没有东西可以拿来验"。用 gpg --recv-keys <指纹> 取回公钥,而指纹要从下载页之外的地方获得,否则这套验证等于自己验自己。
Gotchas
FAILED和FAILED open or read是两种毛病。 前者说明文件损坏或被换掉,后者说明目录里根本没有这个文件。--ignore-missing只解决后者。- 哈希对上不等于来源可信。 哈希防的是下载被截断,不是发行版被替换。可信来源需要有签名的校验和文件,以及从下载页之外获得的公钥。
- 行格式很严格。 哈希和文件名之间必须正好两个空格;写成一个空格或制表符,你会得到
no properly formatted checksum lines found。
Related questions
sha256sum 和 md5sum 有什么区别? 算法不同。MD5 在碰撞攻击面前早已失守,不能用来确认来源;它仍能发现损坏的下载,但没有理由再选它。
在 Windows 上怎么算哈希? cmd 里用 certutil -hashfile app.tar.gz SHA256,PowerShell 里用 Get-FileHash。格式不同,值一样。
校验和对不上该怎么办? 重新下载——多半是传输被截断。第二次还对不上,就换个镜像,并且务必校验签名。
See also
CliAI 会写出校验命令——包括"只下了一个文件"时该加的参数——并在执行前显示出来。一行安装。