检查 SHA256SUMS 并在意外文件上以非零值退出(文件不存在于摘要中)

检查 SHA256SUMS 并在意外文件上以非零值退出(文件不存在于摘要中)

我正在尝试使用 来检查一组下载文件的完整性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遇到没有读取权限的文件。它根本不会打印到标准输出,因此您必须检查生成列表时是否没有发生错误,或者还捕获标准错误输出。

相关内容