三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Linux命令-sum(计算文件校验和)

Linux命令-sum(计算文件校验和)

Linux命令-sum(计算文件校验和)

    • 快速参考
    • 基本用法
    • 两种算法对比
    • 选项说明
    • sum vs 现代哈希工具
    • 使用场景与限制
    • 在脚本中使用

sum是一个轻量级的文件校验和计算工具,输出文件的 16 位校验和与块数。它实现了两种算法:BSDsum(默认)和 System Vsum-s选项)。需要明确的是,sum仅用于检测意外数据损坏,不应用于安全性校验——对于安全需求,请使用md5sumsha256sum等加密哈希工具。

快速参考

sum[选项][文件...]

sum是 Unix 年代遗留下来的校验工具。它的 16 位校验和极易发生碰撞,只能用于检测简单的传输错误,不能防御恶意篡改。

基本用法

# 计算文件的 BSD 校验和(默认)sumfile.txt# 输出: 校验和 块数# 计算文件的 System V 校验和sum-sfile.txt# 计算多个文件的校验和sum*.txt# 从标准输入读取echo"hello world"|sum# 仅显示校验和(不含块数)——用 awk 提取sumfile.txt|awk'{print $1}'# 计算目录下所有文件的总校验和cat*.txt|sum

两种算法对比

# BSD sum(默认)# 算法: 以 1024 字节为块进行 CRC 校验# 输出格式: 校验和 块数 文件名sumfile.txt# 12345 2 file.txt# System V sum (-s)# 算法: 以 512 字节为块进行 16 位累加# 输出格式: 校验和 块数 文件名sum-sfile.txt# 56789 4 file.txt# 两者的差异echo"test">/tmp/testfile.txtecho"BSD sum:$(sum/tmp/testfile.txt)"echo"SysV sum:$(sum-s/tmp/testfile.txt)"

选项说明

选项说明
-rBSD 算法(默认,等同无选项)
-sSystem V 算法(使用 512 字节块)
--help显示帮助
--version显示版本
# 验证两个算法一致性的脚本checksum_compare(){localfile="$1"echo"文件:$file"echo"BSD 校验和:$(sum"$file")"echo"SysV 校验和:$(sum-s"$file")"echo"MD5:$(md5sum"$file"|cut-d' '-f1)"echo"SHA256:$(sha256sum"$file"|cut-d' '-f1)"}checksum_compare"important_data.dat"

sum vs 现代哈希工具

特性summd5sumsha256sum
校验和位数16 位128 位256 位
碰撞可能性极高中等(已知碰撞)极低
安全性低(已破解)
速度
适用场景简单传输验证文件完整性安全校验
推荐使用不建议非安全场景安全场景
# 简单完整性验证(sum 足够)# 场景:检查文件是否在传输中损坏sumoriginal_file.txtsumreceived_file.txt# 如果校验和一致,说明传输大概率正确# 安全场景必须使用 SHA256sha256sum software_package.tar.gz# 与官方发布的哈希值对比# 不要使用 sum 来验证下载的软件包# 错误示范:# wget https://example.com/package.iso# sum package.iso ← 不安全!攻击者可以轻松伪造## 正确示范:# sha256sum package.iso# 对比官方发布的 SHA256 值

使用场景与限制

# sum 仅适合的场景:快速检测无心之失# 1. 文件传输后快速检查sum/source/data.binsum/destination/data.bin# 2. 在低资源嵌入式系统中(无 crypto 库)# 嵌入式设备可能无 sha256sum 命令# 3. 教学演示——展示校验和原理create_test_files(){echo"Hello">/tmp/file1.txtecho"hello">/tmp/file2.txtecho"Hello">/tmp/file3.txtecho"file1:$(sum/tmp/file1.txt)"echo"file2:$(sum/tmp/file2.txt)"echo"file3:$(sum/tmp/file3.txt)"# file1 和 file3 的校验和相同(内容相同)}create_test_files# sum 不适用于:# ❌ 安全验证(防篡改)→ 使用 sha256sum# ❌ 密码存储 → 使用 bcrypt/argon2# ❌ 数字签名 → 使用 PGP/SSH 签名# ❌ 防碰撞需求 → 使用 SHA-256 或更高

在脚本中使用

# 文件传输验证脚本verify_transfer(){localsource="$1"dest="$2"localsrc_sum=$(sum"$source"|awk'{print $1}')localdst_sum=$(sum"$dest"|awk'{print $1}')if["$src_sum"="$dst_sum"];thenecho"✅ 传输验证成功:$source$dest"return0elseecho"❌ 文件校验和不匹配:$source($src_sum) vs$dest($dst_sum)"return1fi}# 目录完整性清单create_manifest(){localdir="${1:-.}"echo"=== 文件清单:$dir==="echo"生成时间:$(date)"echo""find"$dir"-typef-execsum{}\;|sort}create_manifest"/etc"# 备份前后对比# 备份前sum/var/lib/mysql/important.db>/tmp/before_backup.sum# 执行备份...# 备份后验证sum/var/lib/mysql/important.db>/tmp/after_backup.sumdiff/tmp/before_backup.sum /tmp/after_backup.sum&&\echo"备份前后数据一致"||\echo"⚠️ 文件已被修改"

重要建议:在日常工作中,应该优先使用sha256sum进行文件完整性校验。sum的存在价值主要是历史兼容性和在极低资源环境中的轻量级需求。将sum用于安全目的是危险的——它的 16 位校验和有 1/65536 的碰撞概率,对于有意篡改来说几乎毫无防护能力。

← 返回列表