菜鸟科技网

shred命令如何安全彻底删除文件?

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

shred命令如何安全彻底删除文件?-图1
(图片来源网络,侵删)

为什么需要 shred

当你使用 rm filename 删除一个文件时,操作系统并不会立即清除文件数据所在的磁盘扇区,它只是在该文件的 inode(索引节点)上做标记,表示这块空间现在是“空闲”的,可以被新的数据写入,直到有新的数据写入这块区域,旧数据才真正被覆盖。

在这之前,数据恢复软件可以很容易地扫描磁盘并找回这些“已删除”的文件。

shred 就是为了解决这个问题而生的,它会按照你指定的模式,用随机数据、固定数据反复多次地覆盖文件内容,然后再删除文件,使得数据恢复变得极其困难甚至不可能。


shred 的工作原理

shred 的默认覆写策略遵循美国国防部 DoD 5220.22-M 标准,大致过程如下:

shred命令如何安全彻底删除文件?-图2
(图片来源网络,侵删)
  1. 第一次覆写:用 0x00 字节覆盖整个文件。
  2. 第二次覆写:用 0xFF 字节覆盖整个文件。
  3. 第三次覆写:用随机数据覆盖整个文件。
  4. 最终覆写:再次用随机数据覆盖整个文件。
  5. 删除文件:像 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 文件的内容虽然被覆盖了,但文件依然存在,你可以用 cathexdump 查看其内容,会发现是乱码。

示例 2:覆写并删除文件(最常用)

这是 shred 最典型的用法,覆写文件内容,然后安全地删除它。

shred命令如何安全彻底删除文件?-图3
(图片来源网络,侵删)
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)运行此命令,会导致系统崩溃。
  • 在运行前,请务必使用 lsblkfdisk -l 确认设备名称是否正确。

示例 6:只覆写文件的一部分

如果文件开头包含敏感信息,但文件很大,你可以只覆写前 1KB。

shred -s 1K secret.log

重要限制和注意事项

  1. 对于文件系统shred 的效果依赖于它直接操作文件,如果你在一个已经存在的文件上使用 shred,然后又向该文件追加新数据,那么新追加的数据是不会被覆盖的,同样,如果你先 shred 一个文件,然后又通过硬链接或符号链接访问它,shred 可能无法完全清除所有副本。

  2. 对于固态硬盘:SSD 的内部工作原理(闪存、磨损均衡、垃圾回收)使得 shred 的物理位置变得不确定,当你覆写一个逻辑块时,SSD 控制器可能会将其写入一个全新的物理闪存单元,而旧的单元被标记为无效。shred 可能无法可靠地擦除所有数据副本,SSD 的加密功能(如 TCG Opal, ATA Security)是更可靠的安全擦除方式。

  3. 对于日志文件系统:像 ext4, XFS, JFS 等日志文件系统为了数据一致性,会在文件系统日志中记录操作。shred 可能无法清除这些日志中残留的数据信息。

  4. 对于稀疏文件:如果文件是稀疏文件(即包含大量“空洞”),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 也是一个值得考虑的工具。
分享:
扫描分享到社交APP
上一篇
下一篇