Linux命令-sum(计算文件校验和)
Linux命令-sum(计算文件校验和)
- 快速参考
- 基本用法
- 两种算法对比
- 选项说明
- sum vs 现代哈希工具
- 使用场景与限制
- 在脚本中使用
sum是一个轻量级的文件校验和计算工具,输出文件的 16 位校验和与块数。它实现了两种算法:BSDsum(默认)和 System Vsum(-s选项)。需要明确的是,sum仅用于检测意外数据损坏,不应用于安全性校验——对于安全需求,请使用md5sum、sha256sum等加密哈希工具。
快速参考
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)"选项说明
| 选项 | 说明 |
|---|---|
-r | BSD 算法(默认,等同无选项) |
-s | System 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 现代哈希工具
| 特性 | sum | md5sum | sha256sum |
|---|---|---|---|
| 校验和位数 | 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 的碰撞概率,对于有意篡改来说几乎毫无防护能力。