shred 是一个在 Linux 和 Unix-like 系统中用于安全删除文件的命令,普通的 rm 命令只是从文件系统的元数据中删除了文件的“指针”,文件本身的数据实际上还留在磁盘上,直到被新数据覆盖为止,而 shred 则通过多次覆写文件内容,来确保数据无法被恢复。

为什么需要 shred?
当你使用 rm filename 删除一个文件时,操作系统并不会立即清除文件数据所在的磁盘扇区,它只是在该文件的 inode(索引节点)上做标记,表示这块空间现在是“空闲”的,可以被新的数据写入,直到有新的数据写入这块区域,旧数据才真正被覆盖。
在这之前,数据恢复软件可以很容易地扫描磁盘并找回这些“已删除”的文件。
shred 就是为了解决这个问题而生的,它会按照你指定的模式,用随机数据、固定数据反复多次地覆盖文件内容,然后再删除文件,使得数据恢复变得极其困难甚至不可能。
shred 的工作原理
shred 的默认覆写策略遵循美国国防部 DoD 5220.22-M 标准,大致过程如下:

- 第一次覆写:用 0x00 字节覆盖整个文件。
- 第二次覆写:用 0xFF 字节覆盖整个文件。
- 第三次覆写:用随机数据覆盖整个文件。
- 最终覆写:再次用随机数据覆盖整个文件。
- 删除文件:像
rm一样删除文件。
通过这样多轮、不同模式的覆盖,可以有效抹除磁性介质(如传统硬盘)上的数据痕迹,对于现代的固态硬盘,由于闪存磨损均衡机制的存在,shred 的效果会打折扣,但仍然是一种有效的安全删除手段。
基本语法和常用选项
基本语法
shred [选项] 文件名...
常用选项
| 选项 | 全称 | 描述 |
|---|---|---|
-f, --force |
force | 如果文件权限不允许写入,尝试更改权限(类似 chmod)。 |
-n, --iterations=N |
iterations=N | 指定覆写次数,而不是使用默认的 3 次。这是最常用的选项之一。 |
-s, --size=N |
size=N | 只覆写文件的前 N 个字节,而不是整个文件。 |
-u, --remove |
remove | 在覆写完成后,删除文件,这是 shred 的核心功能之一,默认不删除。 |
-v, --verbose |
verbose | 显示正在处理的文件名和覆写进度。 |
-z, --zero |
zero | 在最后一次覆写后,用全零覆盖,这会隐藏文件被 shred 过的事实,对某些取证工具更有效。 |
--random-source=文件 |
random-source=FILE | 指定一个文件作为随机数据的来源,而不是使用系统的随机数生成器。 |
-x, --exact |
exact | 不要扩大文件大小,如果文件大小不是块大小的整数倍,shred 默认会将其扩大,此选项可以阻止这种行为。 |
--help |
help | 显示帮助信息。 |
--version |
version | 显示版本信息。 |
实用示例
示例 1:基本用法(不删除文件)
但不删除文件本身。
shred secret.txt
执行后,secret.txt 文件的内容虽然被覆盖了,但文件依然存在,你可以用 cat 或 hexdump 查看其内容,会发现是乱码。
示例 2:覆写并删除文件(最常用)
这是 shred 最典型的用法,覆写文件内容,然后安全地删除它。

shred -u secret.txt
或者
shred --remove secret.txt
注意:
-u选项会先覆写再删除,并且会尝试将文件名重命名为一堆随机字符,最后才删除,这使得恢复文件名也变得不可能。
示例 3:指定覆写次数
默认覆写 3 次,如果你觉得不够安全,可以指定更多次数,10 次。
shred -v -n 10 secret.txt
-n 10: 覆写 10 次。-v: 显示进度,你可以看到shred正在工作的过程。
示例 4:覆写并隐藏“已 shredding”的痕迹
使用 -z 选项,在最后一次覆写后用全 0 覆盖,这使得文件看起来就像是一个新创建的空文件,而不是一个被安全删除的文件。
shred -u -z secret.txt
示例 5:安全删除整个分区或设备
shred 不仅可以作用于文件,也可以作用于块设备(如硬盘分区、U盘等)。这是一个非常危险的操作,请务必确认你选择的是正确的设备!
# 警告:这会擦除 /dev/sdb1 分区上的所有数据! shred -v -n 3 /dev/sdb1
重要提示:
- 绝对不要对正在使用的系统分区(如 ,
/home)运行此命令,会导致系统崩溃。 - 在运行前,请务必使用
lsblk或fdisk -l确认设备名称是否正确。
示例 6:只覆写文件的一部分
如果文件开头包含敏感信息,但文件很大,你可以只覆写前 1KB。
shred -s 1K secret.log
重要限制和注意事项
-
对于文件系统:
shred的效果依赖于它直接操作文件,如果你在一个已经存在的文件上使用shred,然后又向该文件追加新数据,那么新追加的数据是不会被覆盖的,同样,如果你先shred一个文件,然后又通过硬链接或符号链接访问它,shred可能无法完全清除所有副本。 -
对于固态硬盘:SSD 的内部工作原理(闪存、磨损均衡、垃圾回收)使得
shred的物理位置变得不确定,当你覆写一个逻辑块时,SSD 控制器可能会将其写入一个全新的物理闪存单元,而旧的单元被标记为无效。shred可能无法可靠地擦除所有数据副本,SSD 的加密功能(如 TCG Opal, ATA Security)是更可靠的安全擦除方式。 -
对于日志文件系统:像 ext4, XFS, JFS 等日志文件系统为了数据一致性,会在文件系统日志中记录操作。
shred可能无法清除这些日志中残留的数据信息。 -
对于稀疏文件:如果文件是稀疏文件(即包含大量“空洞”),
shred默认会跳过这些空洞,使用--exact或-x选项可以阻止shred扩大文件大小来覆盖空洞。
替代方案
虽然 shred 很经典,但在现代 Linux 系统中,wipe 命令通常被认为是更强大、更可靠的替代品,因为它能更好地处理文件系统、SSD 和稀疏文件等问题。
wipe 的安装和基本用法:
# 安装 (Debian/Ubuntu) sudo apt-get install wipe # 安装 (CentOS/RHEL/Fedora) sudo yum install wipe # 或 sudo dnf install wipe # 基本用法 wipe -rf /path/to/directory
wipe 会递归地、安全地删除指定目录下的所有文件和子目录。
| 特性 | shred |
rm |
|---|---|---|
| 功能 | 安全删除 | 普通删除 |
| 数据覆写 | 是,多次覆写 | 否,仅删除元数据 |
| 数据恢复可能性 | 极低 | 较高 |
| 对文件系统 | 直接操作文件内容 | 操作文件系统索引 |
| 适用场景 | 需要彻底销毁单个敏感文件 | 日常删除不再需要的文件 |
- 如果你只是想快速删除一个普通文件,使用
rm。 - 如果你处理的是包含高度敏感信息的文件(如密码、密钥、个人隐私文档),并且希望确保数据无法被恢复,
shred -u是一个非常好的选择。 - 对于整个磁盘或分区的安全擦除,
shred可以工作,但要意识到其局限性,并确保操作对象是正确的设备。wipe也是一个值得考虑的工具。
