在网络传输、设备之间转存、版本升级等均会涉及大文件传输,因此,可能会出现传输前后数据不一致的情况。这种情况在网络这种相对更不稳定的环境中,容易出现。那么校验文件的完整性,也是势在必行的。
md5sum命令用于生成和校验文件的md5值。它会逐位对文件的内容进行校验。是文件的内容,与文件名无关,也就是文件内容相同,其md5值相同。md5值是一个128位的二进制数据,转换成16进制则是32(128/4)位的进制值。
062d76d190aa6b7fb0bca71f29f9a10e stack.c
md5校验,有很小的概率不同的文件生成的md5可能相同。比md5更安全的校验算法还有SHA*系列的。
在网络传输时,我们校验源文件获得其md5sum,传输完毕后,校验其目标文件,并对比如果源文件和目标文件md5 一致的话,则表示文件传输无异常。否则说明文件在传输过程中未正确传输。
[root@localhost test]# md5sum --help
用法:md5sum [选项]... [文件]...
显示或检查 MD5(128-bit) 校验和。
若没有文件选项,或者文件处为"-",则从标准输入读取。
-b, --binary 以二进制模式读取
-c, --check 从文件中读取MD5 的校验值并予以检查
-t, --text 以纯文本模式读取(默认)
Note: There is no difference between binary and text mode option on GNU system.
以下三个选项在进行校验时非常有用:
--quiet 不为校验成功的文件输出OK
--status 不输出任何内容,使用退出状态号显示成功
-w, --warn 对格式不准确的校验和行进行警告
--help 显示此帮助信息并退出
--version 显示版本信息并退出
校验和会按照RFC 1321 规范生成。当进行检查时,给出的输入格式应该和程序的输出
样板格式相同。默认的输出模式时输出一行校验和的校验结果,并有一个字符来
表示文件类型("*"代表二进制," "代表纯文本),并同时显示每个文件的名称。
请向bug-coreutils@gnu.org 报告md5sum 的错误
GNU coreutils 项目主页:<http://www.gnu.org/software/coreutils/>
GNU 软件一般性帮助:<http://www.gnu.org/gethelp/>
请向<http://translationproject.org/team/zh_CN.html> 报告md5sum 的翻译错误
要获取完整文档,请运行:info coreutils 'md5sum invocation'
1.生成文件md5值
[root@localhost test]# md5sum stack.c
8a7c020d4e72517435e997215af93eee stack.c
[root@localhost test]# md5sum *
d999b4297802672f7f6dbcc077c6599d abc
e587f3394e058e4f52b31c5628c89611 abcd
6c23e3c5b3277b50828cbca624bad49d add.c
e18466d9ac4b04f6106c7adcf52f9423 a.out
c2fa26f33ff9f05975417593aa3fa03f array
7cc35db2217a6f9efd6788b867e16801 array.c
2.md5sum校验的是文件内容,与文件名无关
[root@localhost test]# file stack.c
stack.c: ASCII text
[root@localhost test]# md5sum -b stack.c
8a7c020d4e72517435e997215af93eee *stack.c
[root@localhost test]# md5sum -t stack.c
8a7c020d4e72517435e997215af93eee stack.c
[root@localhost test]# md5sum stack.c
8a7c020d4e72517435e997215af93eee stack.c
3.md5值重定向
[root@localhost test]# md5sum stack.c
8a7c020d4e72517435e997215af93eee stack.c
[root@localhost test]# cat stack.md5
8a7c020d4e72517435e997215af93eee stack.c
4.将多个文件的md5重定向到指定的文件
[root@localhost test]# md5sum stack* >stack.md5
[root@localhost test]# cat stack.md5
e6d17205c35d40d88b7146fe785c6798 stack
8a7c020d4e72517435e997215af93eee stack.c
bb8f0b96844d2f9f5faa2890b87ffa0c stack.s
重定向追加
这里新增文件ls,单独求其md5,将其md5追加到文件中
[root@localhost test]# md5sum hello.c >>stack.md5
[root@localhost test]# cat stack.md5
e6d17205c35d40d88b7146fe785c6798 stack
8a7c020d4e72517435e997215af93eee stack.c
bb8f0b96844d2f9f5faa2890b87ffa0c stack.s
70040e287845e7e183630ecbe0160b78 hello.c
5.md5校验
[root@localhost test]# md5sum -c stack.md5
stack: 确定
stack.c: 确定
stack.s: 确定
hello.c: 确定
修改文件后,文件md5变化
[root@localhost test]# md5sum -c stack.md5
stack: 确定
stack.c: 失败
stack.s: 确定
hello.c: 确定
md5sum: 警告:1/4 生成的校验和不匹配
–status,不显示校验信息,以命令返回值来判断
校验一致返回0,不一致返回1
[root@localhost test]# md5sum -c stack.md5
stack.c: 确定
[root@localhost test]# md5sum -c --status stack.md5
[root@localhost test]# echo $?
0
特殊说明
1)md5sum 是校验文件内容,与文件名是否相同无关
2)md5sum值逐位校验,所以文件越大,校验时间越长。
总结
通过md5sum来校验生成文件校验码,来发现文件传输(网络传输、复制、本地不同设备间的传输)异常造成的文件内容不一致的情况。