【linux】md5文件相似校验介绍与实战示例

发布于:2025-07-29 ⋅ 阅读:(16) ⋅ 点赞:(0)

在 Linux 中,你可以使用以下几种方式对一个文件进行 MD5 校验,即生成其 MD5 值。


✅ 常用命令:md5sum

md5sum 文件路径
示例:
md5sum test.txt

输出示例:

5eb63bbbe01eeed093cb22bb8f5acdc3  test.txt

✅ 如果只想获取 MD5 值本身(不显示文件名):

md5sum test.txt | awk '{print $1}'

输出:

5eb63bbbe01eeed093cb22bb8f5acdc3

✅ 如果系统没有 md5sum(极少数情况下),可以使用:

1. openssl
openssl md5 文件路径
示例:
openssl md5 test.txt

输出:

MD5(test.txt)= 5eb63bbbe01eeed093cb22bb8f5acdc3

🔍 常见用途:

  • 比对两个文件是否一致(内容相同):
md5sum file1 file2

如果输出的 MD5 值一样,说明内容一致。


实战示例

好的,下面是一个实用的 Shell 脚本,可用于校验文件的 MD5 值是否符合预期,或比对两个文件内容是否一致。


✅ 脚本 1:校验文件是否匹配指定 MD5 值

#!/bin/bash

# 使用方法: ./check_md5.sh <文件路径> <预期MD5值>

FILE=$1
EXPECTED_MD5=$2

if [ ! -f "$FILE" ]; then
  echo "❌ 文件不存在: $FILE"
  exit 1
fi

ACTUAL_MD5=$(md5sum "$FILE" | awk '{print $1}')

if [ "$ACTUAL_MD5" == "$EXPECTED_MD5" ]; then
  echo "✅ MD5 校验通过"
else
  echo "❌ MD5 校验失败"
  echo "期望值: $EXPECTED_MD5"
  echo "实际值: $ACTUAL_MD5"
fi
使用示例:
chmod +x check_md5.sh
./check_md5.sh test.txt 5eb63bbbe01eeed093cb22bb8f5acdc3

✅ 脚本 2:比对两个文件是否相同(通过 MD5)

#!/bin/bash

# 使用方法: ./compare_md5.sh file1 file2

FILE1=$1
FILE2=$2

if [ ! -f "$FILE1" ] || [ ! -f "$FILE2" ]; then
  echo "❌ 某个文件不存在"
  exit 1
fi

MD5_1=$(md5sum "$FILE1" | awk '{print $1}')
MD5_2=$(md5sum "$FILE2" | awk '{print $1}')

if [ "$MD5_1" == "$MD5_2" ]; then
  echo "✅ 两个文件内容一致"
else
  echo "❌ 文件内容不一致"
  echo "$FILE1: $MD5_1"
  echo "$FILE2: $MD5_2"
fi
使用示例:
chmod +x compare_md5.sh
./compare_md5.sh test1.txt test2.txt

好的!接下来给你一个更实用的 目录下所有文件批量计算和校验 MD5 的脚本。你可以用它来:

  • 快速计算某个目录下所有文件的 MD5;
  • 保存为参考值文件;
  • 后续对比是否有文件内容被修改(如备份校验、防篡改等)。

✅ 脚本 3:计算并保存目录中所有文件的 MD5

#!/bin/bash

# 使用方法: ./generate_md5_list.sh <目标目录> <输出文件>

TARGET_DIR=$1
OUTPUT_FILE=$2

if [ ! -d "$TARGET_DIR" ]; then
  echo "❌ 目录不存在: $TARGET_DIR"
  exit 1
fi

echo "📦 正在生成 $TARGET_DIR 下所有文件的 MD5..."

# 清空输出文件
> "$OUTPUT_FILE"

# 遍历目录并计算 MD5
find "$TARGET_DIR" -type f | while read -r file; do
  md5sum "$file"
done >> "$OUTPUT_FILE"

echo "✅ 已写入: $OUTPUT_FILE"
使用示例:
chmod +x generate_md5_list.sh
./generate_md5_list.sh /path/to/mydir md5_list.txt

✅ 脚本 4:校验目录中的文件是否被修改(基于 MD5 清单)

#!/bin/bash

# 使用方法: ./verify_md5_list.sh <md5清单文件>

MD5_LIST_FILE=$1

if [ ! -f "$MD5_LIST_FILE" ]; then
  echo "❌ 清单文件不存在: $MD5_LIST_FILE"
  exit 1
fi

echo "🔍 正在校验文件完整性..."

md5sum -c "$MD5_LIST_FILE"

# 提示:md5sum -c 会自动逐行读取,格式要求是:<md5值><空格><空格><文件路径>
使用示例:
chmod +x verify_md5_list.sh
./verify_md5_list.sh md5_list.txt

输出说明:

  • 如果文件没有改动,会显示 OK
  • 如果文件内容变了、或丢失了,会显示 FAILEDNo such file.

🧠 实战用途举例

  • 🛡️ 部署时验证文件完整性
  • 💾 备份后验证文件是否损坏
  • 🔄 监控文件是否被非法修改(搭配 cron job 定时运行);
  • 📂 保证文件同步的一致性

封装成一个工具包脚本【升级款】

我们现在来写一个 交互式 MD5 工具脚本 md5tool.sh,让你可以轻松选择功能:


✅ 功能菜单设计

我们将包含以下选项:

  1. 生成目录下所有文件的 MD5 清单
  2. 校验文件是否与 MD5 匹配
  3. 比对两个文件是否一致
  4. 批量校验目录文件完整性(基于 MD5 清单)
  5. 退出

🧰 脚本内容 md5tool.sh

#!/bin/bash

# md5tool.sh - 多功能 MD5 工具

while true; do
  echo "==============================="
  echo " 🧰 MD5 工具菜单"
  echo "==============================="
  echo "1. 生成目录文件 MD5 清单"
  echo "2. 校验单个文件是否与指定 MD5 匹配"
  echo "3. 比对两个文件是否内容一致"
  echo "4. 校验目录文件完整性(使用 MD5 清单)"
  echo "5. 退出"
  echo "-------------------------------"
  read -p "请选择操作 [1-5]: " CHOICE

  case $CHOICE in
    1)
      read -p "请输入目标目录路径: " DIR
      read -p "请输入输出清单文件路径 (如 md5_list.txt): " OUTFILE
      if [ ! -d "$DIR" ]; then
        echo "❌ 目录不存在!"
      else
        echo "📦 正在生成 MD5 清单..."
        > "$OUTFILE"
        find "$DIR" -type f | while read -r file; do
          md5sum "$file"
        done >> "$OUTFILE"
        echo "✅ MD5 清单已保存到: $OUTFILE"
      fi
      ;;
    2)
      read -p "请输入文件路径: " FILE
      read -p "请输入预期 MD5 值: " EXPECTED
      if [ ! -f "$FILE" ]; then
        echo "❌ 文件不存在!"
      else
        ACTUAL=$(md5sum "$FILE" | awk '{print $1}')
        if [ "$ACTUAL" == "$EXPECTED" ]; then
          echo "✅ 校验通过,MD5 匹配"
        else
          echo "❌ 校验失败!"
          echo "期望: $EXPECTED"
          echo "实际: $ACTUAL"
        fi
      fi
      ;;
    3)
      read -p "请输入第一个文件路径: " FILE1
      read -p "请输入第二个文件路径: " FILE2
      if [ ! -f "$FILE1" ] || [ ! -f "$FILE2" ]; then
        echo "❌ 某个文件不存在!"
      else
        MD5_1=$(md5sum "$FILE1" | awk '{print $1}')
        MD5_2=$(md5sum "$FILE2" | awk '{print $1}')
        if [ "$MD5_1" == "$MD5_2" ]; then
          echo "✅ 两个文件内容一致"
        else
          echo "❌ 文件不一致!"
          echo "$FILE1: $MD5_1"
          echo "$FILE2: $MD5_2"
        fi
      fi
      ;;
    4)
      read -p "请输入 MD5 清单文件路径: " LISTFILE
      if [ ! -f "$LISTFILE" ]; then
        echo "❌ 清单文件不存在!"
      else
        echo "🔍 开始校验..."
        md5sum -c "$LISTFILE"
      fi
      ;;
    5)
      echo "👋 退出 MD5 工具,再见!"
      exit 0
      ;;
    *)
      echo "❌ 无效选择,请输入 1-5!"
      ;;
  esac

  echo "" # 添加换行
done

🚀 使用方式

  1. 保存为脚本文件:
nano md5tool.sh
# 粘贴脚本后保存
  1. 添加执行权限:
chmod +x md5tool.sh
  1. 运行脚本:
./md5tool.sh

你就能看到一个简单交互式菜单,按数字选功能即可!


💡 可选增强功能(可按需添加):

  • 导出失败项到日志文件;
  • 支持排除某些文件/目录;
  • 支持 SHA256/SHA512 算法选择;
  • 集成定时任务(cron)每天自动校验。


网站公告

今日签到

点亮在社区的每一天
去签到