0015. shell命令--md5sum

目录

15. shell命令--md5sum

功能说明

语法格式

选项说明

实践操作

注意事项


15. shell命令--md5sum

功能说明

        在网络传输、设备之间转存、复制大文件等时,可能会出现传输前后数据不一致的情况。这种情况在网络这种相对更不稳定的环境中,容易出现。那么校验文件的完整性,也是势在必行的。md5sum 命令用于生成和校验文件的 md5 值。它会逐位对文件的内容进行校验。是文件的内容,与文件名无关,也就是文件内容相同,其 md5 值相同。md5 值是一个 128 位的二进制数据,转换成16 进制则是 32(128/4)位的进制值。md5 校验,有很小的概率不同的文件生成的 md5 可能相同。比 md5 更安全的校验算法还有 SHA*系列的。在网络传输时,我们校验源文件获得其 md5sum,传输完毕后,校验其目标文件,并对比如果源文件和目标文件 md5 一致的话,则表示文件传输无异常。否则说明文件在传输过程中未正确传输。

        md5sum 命令来自英文词组 MD5 summation 的缩写,其功能是计算文件内容的 MD5 值,进而比较两个文件是否相同。MD5 值是一个 128 位的二进制数据,转换成十六进制则是 32 位。 用户可以通过此命令对文件内容进行汇总并计算出一个 MD5 值,如果有某两个文件的 MD5 值完全相同,则代表两个文件内容完全相同。文件名称不对计算结果产生影响。

语法格式

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

SYNOPSIS
    md5sum [OPTION]... [FILE]...

选项说明

  • -b 或 --binary:以二进制模式读取文件。
  • -c 或 --check:根据已生成的md5值,对现存文件进行校验。 --status :校验完成后,不生成错误或正确的提示信息,可以通过命令的返回值来判断。
  • -w:检查输入的 md5 值有没有非法行。
  • -t 或 --text:以文本模式读取文件(默认)。

实践操作

1. 不加参数,直接生成文件 md5 值
mkdir -p /test/md5sum    #创建测试目录
cd /test/md5sum   #切换到测试目录
touch file.txt
md5sum file.txt    #直接生成文件 md5 值,类如:d41d8cd98f00b204e9800998ecf8427e
echo linux >file.txt    #写点东西
md5sum file.txt    #再次查看,发现 md5 值变了

2. 以文本模式或二进制模式读入文件并对其进行校验
file file.txt    #查看文件类型   
md5sum -b file.txt    #以二进制模式读取文件
md5sum -t file.txt    #以文本模式读取文件(默认)
md5sum file.txt    #虽然是不同的读入模式,但是在进行求 md5 的时候,是一样的,因为是逐位校验的

3. 将 md5 值重定向到新文件中(可以留着做校验而用的)
md5sum file.txt >newfile1.md5
md5sum file.txt
cat newfile1.md5    #难道要手工校验?No,No,No。
md5sum -c newfile1.md5    #使用参数 -c 进行校验,如果一致,则返回OK,否则返回错误信息
echo Hello >> file.txt    #添点内容
md5sum -c newfile1.md5    #再次校验,返回错误信息
ls
md5sum *    #一次校验多个文件
md5sum * >newfile2.md5
md5sum -c newfile2.md5
md5sum -c --status newfile2.md5    #不显示校验信息,那怎么判断校验结果?
echo $?    #通过此方法来判断,校验结果一致返回 0 ,结果不一致则返回 1 
md5sum -c --status newfile1.md5 
echo $? 
md5sum file.txt >newfile1.md5    #重新记录一下
md5sum -c --status newfile1.md5    #再试一下
echo $?

4. 应用场景简单模拟:需要比较两个包,变更是不是和开发说的一致(了解即可)
4.1. 环境准备
ls
mkdir dir{1..2}
cp *file* dir1
ls dir1/
cat file.txt
echo Linux >file.txt
echo Hello >>file.txt
cat file.txt
mv *file* dir2
ls dir2
tar zcf dir1.tar.gz dir1
tar zcf dir2.tar.gz dir2
tar tf dir1.tar.gz
tar tf dir2.tar.gz
4.2. 开始实验
md5sum dir*.tar.gz
mkdir test_dir{1..2}
tar -zxf dir1.tar.gz -C ./test_dir1
tar -zxf dir2.tar.gz -C ./test_dir2
ls test_dir*
cd test_dir1/dir1/
find . -type f -print0| xargs -0 md5sum >>../../dir1_md5.txt
cd ../../test_dir2/dir2/
find . -type f -print0| xargs -0 md5sum >>../../dir2_md5.txt
diff -c ../../dir1_md5.txt ../../dir2_md5.txt

命令示例:1. 不加参数,直接生成文件 md5 值

mkdir -p /test/md5sum    
cd /test/md5sum   
touch file.txt
md5sum file.txt    
echo linux >file.txt    
md5sum file.txt 

输出结果:

[root@MineGi ~]# mkdir -p /test/md5sum    
[root@MineGi ~]# cd /test/md5sum   
[root@MineGi /test/md5sum]# touch file.txt
[root@MineGi /test/md5sum]# md5sum file.txt 
d41d8cd98f00b204e9800998ecf8427e  file.txt
[root@MineGi /test/md5sum]# echo linux >file.txt    
[root@MineGi /test/md5sum]# md5sum file.txt 
5bb062356cddb5d2c0ef41eb2660cb06  file.txt
[root@MineGi /test/md5sum]# 

命令示例:2. 以文本模式或二进制模式读入文件并对其进行校验

file file.txt    
md5sum -b file.txt    
md5sum -t file.txt    
md5sum file.txt

输出结果:

[root@MineGi /test/md5sum]# file file.txt    
file.txt: ASCII text
[root@MineGi /test/md5sum]# md5sum -b file.txt    
5bb062356cddb5d2c0ef41eb2660cb06 *file.txt
[root@MineGi /test/md5sum]# md5sum -t file.txt  
5bb062356cddb5d2c0ef41eb2660cb06  file.txt
[root@MineGi /test/md5sum]# md5sum file.txt
5bb062356cddb5d2c0ef41eb2660cb06  file.txt
[root@MineGi /test/md5sum]# 

命令示例:3. 将 md5 值重定向到新文件中(可以留着做校验而用的)

md5sum file.txt >newfile1.md5
md5sum file.txt 
cat newfile1.md5    
md5sum -c newfile1.md5    
echo Hello >> file.txt    
md5sum -c newfile1.md5    
ls
md5sum *    
md5sum * >newfile2.md5
md5sum -c newfile2.md5
md5sum -c --status newfile2.md5    
echo $?    
md5sum -c --status newfile1.md5 
echo $? 
md5sum file.txt >newfile1.md5    
md5sum -c --status newfile1.md5    
echo $?

输出结果:

[root@MineGi /test/md5sum]# md5sum file.txt >newfile1.md5
[root@MineGi /test/md5sum]# md5sum file.txt 
5bb062356cddb5d2c0ef41eb2660cb06  file.txt
[root@MineGi /test/md5sum]# cat newfile1.md5  
5bb062356cddb5d2c0ef41eb2660cb06  file.txt
[root@MineGi /test/md5sum]# md5sum -c newfile1.md5    
file.txt: 确定
[root@MineGi /test/md5sum]# echo Hello >> file.txt    
[root@MineGi /test/md5sum]# md5sum -c newfile1.md5  
file.txt: 失败
md5sum: 警告:1 个校验和不匹配
[root@MineGi /test/md5sum]# ls
file.txt  newfile1.md5
[root@MineGi /test/md5sum]# md5sum *    
16e4ad802897522778c35b59def1c160  file.txt
acd595cf01d4fe597f10483a84857977  newfile1.md5
[root@MineGi /test/md5sum]# md5sum * >newfile2.md5
[root@MineGi /test/md5sum]# md5sum -c --status newfile2.md5    
[root@MineGi /test/md5sum]# echo $?    
0
[root@MineGi /test/md5sum]# md5sum -c --status newfile1.md5 
[root@MineGi /test/md5sum]# echo $? 
1
[root@MineGi /test/md5sum]# md5sum file.txt >newfile1.md5    
[root@MineGi /test/md5sum]# md5sum -c --status newfile1.md5  
[root@MineGi /test/md5sum]# echo $?
0
[root@MineGi /test/md5sum]# 

4. 应用场景简单模拟:需要比较两个包,变更是不是和开发说的一致(了解即可)

命令示例:4.1. 环境准备

ls
mkdir dir{1..2}
cp *file* dir1
ls dir1/
cat file.txt
echo Linux >file.txt
echo Hello >>file.txt
cat file.txt
mv *file* dir2
ls dir2
tar zcf dir1.tar.gz dir1
tar zcf dir2.tar.gz dir2
tar tf dir1.tar.gz
tar tf dir2.tar.gz

输出结果:

[root@MineGi /test/md5sum]# ls
file.txt  newfile1.md5  newfile2.md5
[root@MineGi /test/md5sum]# mkdir dir{1..2}
[root@MineGi /test/md5sum]# cp *file* dir1
[root@MineGi /test/md5sum]# ls dir1/
file.txt  newfile1.md5  newfile2.md5
[root@MineGi /test/md5sum]# cat file.txt
linux
Hello
[root@MineGi /test/md5sum]# echo Linux >file.txt
[root@MineGi /test/md5sum]# echo Hello >>file.txt
[root@MineGi /test/md5sum]# cat file.txt
Linux
Hello
[root@MineGi /test/md5sum]# mv *file* dir2
[root@MineGi /test/md5sum]# ls dir2
file.txt  newfile1.md5  newfile2.md5
[root@MineGi /test/md5sum]# tar zcf dir1.tar.gz dir1
[root@MineGi /test/md5sum]# tar zcf dir2.tar.gz dir2
[root@MineGi /test/md5sum]# tar tf dir1.tar.gz
dir1/
dir1/file.txt
dir1/newfile1.md5
dir1/newfile2.md5
[root@MineGi /test/md5sum]# tar tf dir2.tar.gz
dir2/
dir2/file.txt
dir2/newfile1.md5
dir2/newfile2.md5
[root@MineGi /test/md5sum]# 

命令示例:4.2. 开始实验

md5sum dir*.tar.gz
mkdir test_dir{1..2}
tar -zxf dir1.tar.gz -C ./test_dir1
tar -zxf dir2.tar.gz -C ./test_dir2
ls test_dir*
cd test_dir1/dir1/
find . -type f -print0| xargs -0 md5sum >>../../dir1_md5.txt
cd ../../test_dir2/dir2/
find . -type f -print0| xargs -0 md5sum >>../../dir2_md5.txt
diff -c ../../dir1_md5.txt ../../dir2_md5.txt

输出结果:

[root@MineGi /test/md5sum]# md5sum dir*.tar.gz
2feb06f5443dd3fefc22427e9f74b979  dir1.tar.gz
50634df4c1479b80338cd1444b3c005f  dir2.tar.gz
[root@MineGi /test/md5sum]# mkdir test_dir{1..2}
[root@MineGi /test/md5sum]# tar -zxf dir1.tar.gz -C ./test_dir1
[root@MineGi /test/md5sum]# tar -zxf dir2.tar.gz -C ./test_dir2
[root@MineGi /test/md5sum]# ls test_dir*
test_dir1:
dir1

test_dir2:
dir2
[root@MineGi /test/md5sum]# cd test_dir1/dir1/
[root@MineGi /test/md5sum/test_dir1/dir1]# find . -type f -print0| xargs -0 md5sum >>../../dir1_md5.txt
[root@MineGi /test/md5sum/test_dir1/dir1]# cd ../../test_dir2/dir2/
[root@MineGi /test/md5sum/test_dir2/dir2]# find . -type f -print0| xargs -0 md5sum >>../../dir2_md5.txt
[root@MineGi /test/md5sum/test_dir2/dir2]# diff -c ../../dir1_md5.txt ../../dir2_md5.txt
*** ../../dir1_md5.txt    2024-11-27 18:20:14.078601328 +0800
--- ../../dir2_md5.txt    2024-11-27 18:20:21.358522557 +0800
***************
*** 1,3 ****
! 16e4ad802897522778c35b59def1c160  ./file.txt
  0aa6742ae19e435052874382173a8195  ./newfile1.md5
  93f91af4f9e3933668fc1ac9a9445e31  ./newfile2.md5
--- 1,3 ----
! b5330f92c7a15c333aa651b53d6654a8  ./file.txt
  0aa6742ae19e435052874382173a8195  ./newfile1.md5
  93f91af4f9e3933668fc1ac9a9445e31  ./newfile2.md5
[root@MineGi /test/md5sum/test_dir2/dir2]# 

注意事项

  • md5sum 是校验文件内容,与文件名是否相同无关
  • md5sum 值逐位校验,所以文件越大,校验时间越长。
  • 当使用 md5sum 校验文件时,确保你信任提供哈希值的源,以防止中间人攻击或其他形式的篡改。
  • MD5 算法已经不被认为是安全的,因为它容易受到碰撞攻击。对于需要高度安全性的场景(如密码存储或数字签名),建议使用更安全的哈希算法,如 SHA-256 或 SHA-3。

        总的来说,md5sum 是一个简单而实用的工具,用于验证文件的完整性和真实性。然而,在安全性要求较高的场景中,可能需要使用更强大和安全的哈希算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MineGi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值