哈希校验总结

本篇为数据管理第二步
文件筛选整理 -> 生成哈希文件 -> 生成冗余数据 -> 定时同步多处备份

常用客户端如下
quickhash 推荐。跨平台图形界面,开源免费。功能强大,批量生成。包含的哈希校验类型齐全,也支持2020年出的BLAKE3
hashdeep 跨平台命令行,开源免费。可以递归产生并计算校验哈希值是否正确。该程序在以“hashdeep”和“md5deep”名称运行时具有不同的选项和功能。在同一个目录下生成一个校验文件( . SFV 文件),该校验文件包含该目录下的所有文件 md5 信息。
HashCheck 开源免费 Windows 有中文,批量校验,集成扩展菜单。
Windows 及 macOS 下 GUI 单个文件可以用:fhash 开源免费。
免费不开源,备用:(HashTab 、HashTools:Windows 下批量 )

可以使用 BLAKE3 代替其它哈希码(md5,sha1,sha256,sha3等),因为BLAKE3的校验速度比其它的哈希校验快太多(大约快 10 倍到 20 倍),且安全性不输sha3甚至更安全。

MacOS平台

MacOS 自带批量生成sha256命令

# 生成哈希文件,Maxdepth 为最大目录层数
find . -maxdepth 6 ! -path "*/.hide_par2dir/*" -type f ! -name "._*" -type f ! -name "sha256.sum" -type f ! -name ".DS_Store" -type f -print | xargs -I {} shasum -a 256 {} > sha256.sum

# 检查文件哈希(简单方法)。进入该目录执行:
shasum -c sha256.sum

# 检查文件,如果文件有错则输出该文件名。先cd 到该目录:
var_fail=$(shasum -c sha256.sum 2> /dev/null | grep "FAILED" | cut -d : -f 1 ) && $(if [ -n "${var_fail}" ]; then echo ${var_fail} > sum_fail.txt; fi)

Linux平台

Linux 自带批量生成sha256命令,跟macOS的名称不同。Linux是sha256sumsha512sum之类,macOS要加-a参数指定多少位,例如 -a 512

# 生成哈希文件,Maxdepth 为最大目录层数
find . -maxdepth 6 ! -path "*/.hide_par2dir/*" -type f ! -name "._*" -type f ! -name "sha256.sum"  -type f -exec sha256sum {} \; > sha256.sum
# Linux版相比macOS使用了-exec 代替 xargs,代码可互换,效果一样,留作对照参考代码。

# 检查文件哈希(简单方法)。进入该目录执行:
sha256sum -c sha256.sum

# 检查文件,如果文件有错则输出该文件名。先cd 到该目录:
var_fail=$(sha256sum -c sha256.sum 2> /dev/null | grep "FAILED" | cut -d : -f 1 ) && $(if [ -n "${var_fail}" ]; then echo ${var_fail} > sum_fail.txt; fi)

Windows平台

Windows 下直接用开源的 HashCheckquickhashhashdeep 来生成或校验。
如果有 macOS 隐藏文件,在Windows的cmd输入以下命令删除

# /AH 代表隐藏文件
del /AH ._*

Windows 下装 Git BashCygwin 后可以使用 Linux 常见命令。

BLAKE3校验

BLAKE3由于校验速度快,但是对机器资源占用相对少。适用于检查大量文件,设置定时计划任务的日常维护,设置有文件故障时候自动发邮件通知。

一、安装
方式①:
BLAKE3 的官方GitHub下载对应平台的执行文件。放到运行目录,加入环境变量(Linux及macOS可以设置alias对应该文件绝对路径)。名字统一改为b3sum ,因为默认就是这个命令名。

方式②:
用系统自带的包管理或第三方包管理安装。

macOS平台:

brew install b3sum

Linux及Windows平台建议用方式一,下载单文件放到对应的bin目录较快。

二、使用

简单使用–进入到目标目录,执行以下命令:

# 生成校验文件(只含单个文件的blake3信息)
b3sum abc.txt > abc.txt.blake3

# 校验文件有没有数据丢失
b3sum -c abc.txt.blake3

进阶操作–递归目录生成校验文件,与检验失败记录信息到文件:

# 生成校验文件,单个blake3.sum文件里含有批量文件的信息,可以更改最深目录层级maxdepth的数值。
find . -maxdepth 6 ! -path "*/.hide_par2dir/*" -type f ! -name "._*" -type f ! -name "sha256.sum" -type f ! -name "blake3.sum" -type f ! -name ".DS_Store" -type f -print | xargs -I {} b3sum {} > blake3.sum

# 检查文件,如果文件有错则输出该文件名。先cd 到该目录:
var_fail=$(b3sum -c blake3.sum 2> /dev/null | grep "FAILED" | cut -d : -f 1 ) && $(if [ -n "${var_fail}" ]; then echo ${var_fail} > sum_fail.txt; fi)

因为生成与校验的命令格式基本一样,把上面脚本中对应的 sha256sumshasum命令换成b3sum即可。

通用排除选项

find 命令排除某文件,附加以下命令。适用于macOS及Linux。

# 排除目录,以下为排除所有含“.hide_par2dir”的路径:
! -path "*/.hide_par2dir/*"
# 排除特殊结尾(格式)文件,以下为排除 txt 文件:
-type f ! -name "*.txt"
# 排除隐藏文件 (即点号开头):
-type f ! -name ".*"
# 排除macOS隐藏文件 (即._开头):
-type f ! -name "._*"
# 只查找特定类型的文件
-regex '.*\.txt\|.*\.doc\|.*\.mp3'  

校验结果邮件通知

设置定时计划,定时检查哈希值是否异常。如果生成的错误文件(检测),用 msmtp 发邮件通知,发邮件时候把目录也写进去。

本示例代码比上面检测代码增加了错误时发邮件的功能。

以下是blake3版校验示例,可把以下b3sum -c blake3.sum换成对应平台其它哈希校验命令 。

#!bin/bash
cd '/data/'
var_fail=$(b3sum -c blake3.sum 2> /dev/null | grep "FAILED" | cut -d : -f 1 ) && (if [ -n "${var_fail}" ]; then echo "故障目录为:\\n`pwd | tee -a /var/tmp/err_par2dir.txt` \\n \\n故障文件为:\\n`echo ${var_fail} | tee sum_fail.txt` \\n" | mail -s "文件hash故障: `date` " 收件用户名@outlook.com; fi) 

注意
这里cd '/data/'换成要监控数据状况的目录,同时这里有已生成的哈希校验文件。测试的时候请把 2> /dev/null 删除或转写到另外一个文件,方便看报错信息。收件用户名@outlook.com 换成自己的收件箱。存放故障目录的txt路径/var/tmp/err_par2dir.txt。增加awk '{print $0 "\n"}'可以在每行行尾添加换行符。

保存为 check_files_blake3sum.sh 文件,存放到某目录,例如/usr/local/bin,添加执行权限。添加crontab定时计划,不繁忙但有开机的固定时间校验一次,例如一周一次,周六22点50分开始执行。
运行crontab -e,输入以下命令保存:

50 22 * * 6 /usr/local/bin/check_files_blake3sum.sh

运行前,需配置好相关邮箱信息。邮箱信息配置可以参考这篇文章:
命令行发送邮件

生成冗余数据及恢复数据请参考这篇文章:
数据冗余及恢复