我正在尝试使用 来检查一组下载文件的完整性sha256sum
。
我使用 PGP 对摘要文件(名为SHA256SUMS
)进行了加密签名。我通过递归计算当前目录下所有文件的校验和来创建文件
find . -type f -not -name SHA256SUMS -exec sha256sum '{}' \; >> SHA256SUMS
我现在可以通过(在检查摘要文件的签名之后,为了简单起见,在这个问题中省略)执行以下命令来验证文件的完整性:
sha256sum -c SHA256SUMS
如果摘要文件中的任何文件的内容与摘要文件中存储的内容不同,则上述命令将以非零值退出。
然而,它会不是如果有一些新文件未在摘要中列出,则退出非零。
sha256sum
如果存在意外文件,我找不到任何失败的选项。
如何使用 递归地验证目录的完整性sha256sum
,包括在未验证的文件上失败?
答案1
您可以创建一个排序的文件列表:
find . -type f | sort
以及带有校验和的排序文件列表:
find . -type f -print0 | sort -z | xargs -0 sha256sum
然后只需使用cmp
,diff -u
或类似的方法来比较生成的列表。如果没有添加或删除文件,则每次的结果应该是相同的。
您可以仅从 SHA256SUMS 中提取文件名,而不是单独存储文件列表,例如使用cut --bytes=67-
.
仅比较文件列表(不带校验和)可以让您快速确定文件是否被添加或删除,而无需计算这些文件的校验和。
总而言之,假设您的 SHA256SUMS 文件已经存在:
diff -u \
<(cut --bytes=67- < SHA256SUMS) \
<(find . -type f -not -name SHA256SUMS -print | sort)
如果没有显示输出,则文件列表是相同的(可能除了子目录中的其他 SHA256SUMS 文件,因为 find 也排除了这些文件)。
另一个极端情况是sha256sum
遇到没有读取权限的文件。它根本不会打印到标准输出,因此您必须检查生成列表时是否没有发生错误,或者还捕获标准错误输出。