在bash中测试tar文件的完整性


25

我有一个创建'.tar'文件的bash脚本。创建文件后,如果完整性不好,我想测试其完整性并向root用户发送电子邮件。

我知道我需要使用命令tar -tf /root/archive.tar来检查文件的完整性,但是我将如何在bash if语句中实现此功能并检查错误?

Answers:


33

如果tar在输入中发现错误,它将exit(3)¹退出值不为零。使用tar-列出存档内容时,大多数情况下也会执行此操作t。因此,您只需检查的退出值tar即可确定是否出了问题:

if ! tar tf /root/archive.tar &> /dev/null; then
    write_an_email_to_root
fi

如果您tar找不到的所有错误t,仍然可以将存档提取到stdout并重定向stdout/dev/null,这将是较慢但更可靠的方法:

if ! tar xOf /root/archive.tar &> /dev/null; then
    write_an_email_to_root
fi

¹此符号表示手册页,而不是实际的调用。请参阅man 3 exit


1
您可能想要将tar输出重定向到/dev/null,因为您实际上可能不想看到它。
凯文(Kevin)

1
并非所有的tar实现都使用来检测或报告所有错误tbsdtar不是,您可以tar xOf file.tar > /dev/null在此处使用)。并非所有tar实现都会以退出状态2 star(255)或bsdtar(1)退出,但重要的是此处的退出状态为非零。
斯特凡Chazelas

1
我相应地编辑了我的帖子。与exit(2)我有关的是适当的联机帮助页,而不是确切的退出值(这就是为什么我在下句话中明确提到“非零”的原因)。对此进行注释(并将该部分更改为右侧的-.-)。
Andreas Wiese 2014年

您的答案仅与列出和提取功能有关,如果我使用编辑器打开tar存档并进行更改,则您的解决方案将不会捕获任何类型的错误...对不起
THESorcerer

0

抱歉,但是您不能,tar似乎缺乏测试功能(例如,如果您忘记了* nix并尝试使用winrar对其进行测试,结果将是:“此类型的存档不支持该命令”)

我在上面的评论中指出的方式是,tar实际上没有内部CRC来具有比较术语,因此,如果您使用编辑器更改tar归档文件,则列出和提取操作可​​能没有任何错误,但是可以提取损坏的数据

总之,我最终希望在这里找到一种解决方案,但是还没有一个,幸运的是,有两个好消息:

有非常非常非常少的tar存档,它们也没有用其他程序(例如gzip,bzip2等)压缩,因此该程序将具有测试解决方案,而没有压缩它们的人则有点la脚,真的

对于我的个人问题,很幸运,将其解压缩后,我发现了一个md5sum文件,其中包含所有文件的CRC(即使是将tar tar放在网络上并且不想压缩它的人,他仍然想成为可以验证)


-5

您可以通过将以下参数传递给来实现tar

$ tar -cvzf test.tar test_file

2
单行答案通常没有那么大的帮助。考虑扩展您的帖子,以包含支持您的解决方案的某些源材料(例如文档)。
HalosGhost 2014年

6
-c创建通过-f('test.tar')命名的文件。-zgzip存档。-v使它变得冗长。我很确定这不是一个准确的解决方案。
EpicVoyage 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.