哈希校验总结
本篇为数据管理第二步:
文件筛选整理 -> 生成哈希文件 -> 生成冗余数据 -> 定时同步多处备份
常用客户端如下:
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是sha256sum
、sha512sum
之类,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 下直接用开源的 HashCheck ,quickhash或 hashdeep 来生成或校验。
如果有 macOS 隐藏文件,在Windows的cmd输入以下命令删除
# /AH 代表隐藏文件
del /AH ._*
Windows 下装 Git Bash 或 Cygwin 后可以使用 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)
因为生成与校验的命令格式基本一样,把上面脚本中对应的 sha256sum
,shasum
命令换成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
运行前,需配置好相关邮箱信息。邮箱信息配置可以参考这篇文章:
命令行发送邮件
生成冗余数据及恢复数据请参考这篇文章:
数据冗余及恢复