当前位置: 首页 > news >正文

Linux shell编程学习笔记42:md5sum

0 前言

前几天在国产电脑上遇到一个问题,先后接到两个文件,如何判断这两个文件内容是否相同?

如果是在Windows系统,可以用fc命令,或者用我自己写的FileInfo,提取两个文件有MD5、SHA1、CRC32值进行比较来判断。

其实,在Linux系统中,提供了md5sum命令来计算md5值。

MD5 全称是报文摘要算法(Message-Digest Algorithm 5),可以对任意长度的信息逐位进行计算,产生一个二进制长度为128位(十六进制长度就是32位)的校验值(checksums,或称“指纹”“报文摘要”),不同的信息产生相同的报文摘要的可能性是非常非常之小的。

1 md5sum命令的功能和格式

我们可以使用命令 md5sum --help命令 查看它的用法:

purpleEndurer @ bash \w $ md5sum --help
Usage: md5sum [OPTION]... [FILE]...
Print or check MD5 (128-bit) checksums.
With no FILE, or when FILE is -, read standard input.

  -b, --binary         read in binary mode
  -c, --check          read MD5 sums from the FILEs and check them
      --tag            create a BSD-style checksum
  -t, --text           read in text mode (default)
  Note: There is no difference between binary and text mode option on GNU system.

The following four options are useful only when verifying checksums:
      --quiet          don't print OK for each successfully verified file
      --status         don't output anything, status code shows success
      --strict         exit non-zero for improperly formatted checksum lines
  -w, --warn           warn about improperly formatted checksum lines

      --help     display this help and exit
      --version  output version information and exit

The sums are computed as described in RFC 1321.  When checking, the input
should be a former output of this program.  The default mode is to print
a line with checksum, a character indicating input mode ('*' for binary,
space for text), and name for each FILE.

GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
Report md5sum translation bugs to <http://translationproject.org/team/>
For complete documentation, run: info coreutils 'md5sum invocation'
purpleEndurer @ bash \w $

 

1.1 md5sum命令的功能

采用MD5报文摘要算法打印或校验 MD5 (128-位) 校验值。

1.2 md5sum命令的格式

md5sum [选项]... [文件]...

1.2.1 选项及功能
选项说明备注

-b

--binary

以二进制模式读取文件GNU系统上的二进制模式选项和文本模式选项之间没有区别

-c

--check

从 FILE 中读取 MD5 总和并检查它们
--tag创建一个 BSD 样式的校验和

-t

--text

以文本模式读取文件(默认)GNU系统上的二进制选项和文本模式选项之间没有区别
--quiet不要为每个成功验证的文件打印 OK这四个选项仅在验证校验和时有用
--status不输出任何内容,状态代码显示成功
--strict退出非零,用于格式不正确的校验行

-w

--warn

发现格式不正确的校验行时进行警告
--help显示此帮助并退出
--version输出版本信息并退出

1.2.2 其它说明

如果没有 指定文件,或者当 文件 为 - 时,读取标准输入。

2 md5sum命令使用实例

2.1 用默认的文本模式读取指定文件并输出md5校验值

purpleEndurer @ bash ~ $ echo "123456" > 1.txt

purpleEndurer @ bash ~ $ md5sum 1.txt
f447b20a7fcbf53a5d5be013ea0b15af  1.txt

我们先用 echo命令创建文件1.txt,文件内容是:123456

然后我们用md5sum命令来输出文件1.txt的md5校验值:f447b20a7fcbf53a5d5be013ea0b15af

2.2 用二进制模式读取指定文件并输出md5校验值

purpleEndurer @ bash ~ $ md5sum -b 1.txt 
f447b20a7fcbf53a5d5be013ea0b15af *1.txt

可以看到,当我们指定用二进制模式读取时,被读取的文件名名前多了一个*。

2.3 用默认的文本模式读取指定字符串并输出md5校验值

purpleEndurer @ bash ~ $ echo "123456" | md5sum
f447b20a7fcbf53a5d5be013ea0b15af  -

由于我们没有指定文件,所以显示的文件名是-,代表标准输入。 

如果我们不使用echo命令:

purpleEndurer @ bash ~ $ "123456" | md5sum
bash: 123456: command not found
d41d8cd98f00b204e9800998ecf8427e  -

仍然可以获得 md5校验值,不过在此之前会显示一条错误信息:bash: 123456: command not found。

2.4 用二进制模式读取指定字符串并输出md5校验值

purpleEndurer @ bash ~ $ echo "123456" | md5sum -b
f447b20a7fcbf53a5d5be013ea0b15af *-

 同样,代表标准输入的-前有*。

2.5 md5sum -c md5文件:用md5校验值校验文件

purpleEndurer @ bash \w $ echo "123456" > 1.txt
purpleEndurer @ bash \w $ md5sum 1.txt > 123456.md5
purpleEndurer @ bash \w $ cat 123456.md5
f447b20a7fcbf53a5d5be013ea0b15af  1.txt
purpleEndurer @ bash \w $ md5sum -c 123456.md5
1.txt: OK
purpleEndurer @ bash \w $ echo "12345678" > 1.txt
purpleEndurer @ bash \w $ md5sum -c 123456.md5   
1.txt: FAILED
md5sum: WARNING: 1 computed checksum did NOT match

purpleEndurer @ bash \w $

 我们先用 命令 echo "123456" > 1.txt 创建文件1.txt,文件内容是:123456

接着使用命令 md5sum 1.txt > 123456.md5 将文件 1.txt的md5校验值保存到文件 123456.md5

然后用命令 cat 123456.md5 查看 文件 123456.md5的内容。

再用命令md5sum -c 123456.md5 来对文件1.txt进行校验,结果:

1.txt: OK

接着我们使用命令 echo "12345678" > 1.txt  文件1.txt的内容改为:12345678

再用命令md5sum -c 123456.md5 来对文件1.txt进行校验,结果:

1.txt: FAILED
md5sum: WARNING: 1 computed checksum did NOT match

2.6 md5sum -c --quiet md5文件:用md5校验值校验文件,文件成功验证时不打印 OK

purpleEndurer @ bash \w $ echo "123456" > 1.txt    
purpleEndurer @ bash \w $ md5sum -c --quiet 123456.md5
purpleEndurer @ bash \w $ echo "12345678" > 1.txt     
purpleEndurer @ bash \w $ md5sum -c --quiet 123456.md5
1.txt: FAILED
md5sum: WARNING: 1 computed checksum did NOT match

purpleEndurer @ bash \w $

这里我们先后执行了两次命令:md5sum -c --quiet 123456.md5,注意两次命令反馈信息的差异。

当我们第一次执行命令md5sum -c --quiet 123456.md5时,由于验证成功,所以没有显示信息。

当我们修改了1.txt文件的内容后,第二次执行命令md5sum -c --quiet 123456.md5时,由于验证不成功,所以看到了信息:

1.txt: FAILED
md5sum: WARNING: 1 computed checksum did NOT match

2.7 md5sum -c --quiet --status md5文件:用md5校验值校验文件,通过状态代码反馈校验是否成功

purpleEndurer @ bash \w $ echo "123456" > 1.txt                 
purpleEndurer @ bash \w $ md5sum 1.txt > 123456.md5 
purpleEndurer @ bash \w $ md5sum -c --quiet --status  123456.md5
purpleEndurer @ bash \w $ echo $?                               
0
purpleEndurer @ bash \w $ echo "12345678" > 1.txt               
purpleEndurer @ bash \w $ md5sum -c --quiet --status  123456.md5
purpleEndurer @ bash \w $ echo $?                               
1
purpleEndurer @ bash \w $ 

 由于指定了--status选项,所以不论md5sum命令对文件校验是否成功,都不会显示信息,我们可以使用$?获取命令的状态代码来判断校验是否成功。

当我们第一次执行命令md5sum -c --quiet --status 123456.md5时,由于验证成功,$?的值为0。

当我们修改了1.txt文件的内容后,第二次执行命令md5sum -c --quiet 123456.md5时,由于验证不成功,$?的值为1。

相关文章:

  • 傅立叶之美:深入研究傅里叶分析背后的原理和数学
  • LeetCode 面试经典150题 290.单词规律
  • 虚拟机-从头配置Ubuntu18.04(包括anaconda,cuda,cudnn,pycharm,ros,vscode)
  • 如何调试Clang源码
  • Llama模型下载
  • 双进程交互实现App自动重启
  • 电脑突然死机怎么办?
  • axios发送get请求但参数中有数组导致请求路径多出了“[]“的处理办法
  • 纯分享万岳外卖跑腿系统客户端源码uniapp目录结构示意图
  • sql造数据
  • zedboard+AD9361 运行 open WiFi
  • 【案例·增】获取当前时间、日期(含,SQL中DATE数据类型)
  • 【Python从入门到进阶】51、电影天堂网站多页面下载实战
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • Linux:Jenkins:参数化版本回滚(6)
  • JavaScript 基本功--面试宝典
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • MySQL主从复制读写分离及奇怪的问题
  • socket.io+express实现聊天室的思考(三)
  • springMvc学习笔记(2)
  • 百度地图API标注+时间轴组件
  • 读懂package.json -- 依赖管理
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 巧用 TypeScript (一)
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 自动记录MySQL慢查询快照脚本
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • #LLM入门|Prompt#3.3_存储_Memory
  • #Spring-boot高级
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (a /b)*c的值
  • (NSDate) 时间 (time )比较
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (十)c52学习之旅-定时器实验
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET 回调、接口回调、 委托
  • .net和php怎么连接,php和apache之间如何连接
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • [Android] Android ActivityManager
  • [BJDCTF 2020]easy_md5
  • [BZOJ 1040] 骑士
  • [BZOJ1877][SDOI2009]晨跑[最大流+费用流]
  • [C# 网络编程系列]专题六:UDP编程
  • [flask]http请求//获取请求头信息+客户端信息
  • [IE9] GPU硬件加速到底是实用创新还是噱头
  • [Latex] \bibitem{} | .bbl 格式参考文献转换与获得