「shred(1)」-

覆盖文件来隐藏其内容,并可以选择删除它

命令语法格式

shred [OPTION]… FILE…

命令描述

命令shred覆盖设备或文件,以帮助防止恢复数据。

通常,当你删除文件(请参阅rm(1)调用)时,实际上不会销毁文件的数据。仅销毁列出文件存储位置的索引,并使存储空间可用于重用。有一些取消删除的程序(数据恢复程序)会尝试重建索引,如果这些部分索引没有被重用,则可以将文件恢复。

在一个驱动近乎完全使用的繁忙系统上,空间可以在几秒钟内重复使用。但是这也没有办法确定。如果你有敏感数据,你可能希望通过使用非敏感数据来确定覆盖文件,以此来确保无法进行恢复。

然而,即使在这样做之后,也可以将磁盘带回实验室,并使用许多敏感(且昂贵)的设备来寻找覆盖数据下面的原始数据的微弱“回声”。如果数据只被覆盖一次,就不那么难了。

不可挽回的去除东西的最好方法是用酸破坏它所用的介质,将其熔化,或类似。对于像软盘这样便宜的可移动介质,这是首选方法。然而,硬盘驱动器昂贵且难以熔化,因此命令shred试图使用非破坏性的方式实现类似的效果。

这使用了许多覆盖传递,并且数据模式选择了以最大化对旧数据进行破坏。虽然这适用于软盘,但这些模式的设计是为了在硬盘上实现最佳效果。有关更多详细信息,请参阅第六届USENIX安全研讨会(加利福尼亚州圣何塞,1996年7月22日至25日)的会议记录中的源代码和Peter Gutmann的论文「磁性和固态存储器数据的安全删除」。

请注意,命令shred依赖于一个非常重要的假设:文件系统会覆盖数据。这是传统的做事方式,但许多现代文件系统设计并不满足这一假设。例外的情况包括:

  • 日志结构或日志文件系统。例如,由AIX和Solaris提供的文件系统,JFS,ReiserFS,XFS,Ext3(在data=journal模式中),BFS,NTFS等,当它们配置为对数据进行日志时。
  • 即使某些写入失败了,也会写入冗余数据,并继续执行的文件系统。例如,基于RAID的文件系统。
  • 会创建快照的文件系统。例如,网络应用程序的NFS服务器。
  • 将缓存放在临时位置的文件系统。例如,NFS第3个版本的客户端。
  • 压缩的文件系统。

在Ext3文件系统的特定情况下,上述说明仅在data=journal模式中适用(并且shred因此效果有限),该模式除了元数据之外还记录了文件数据。在data=ordered(默认)和data=writeback模式中,shred像往常一样工作。如果想要更改Ext3日记记录模式,可以在/etc/fstab文件中为特定文件系统的挂载添加data=something选项,如mount(8)手册中所述。

如果你不确定文件系统的运行方式,那么你应该假设shred不会覆盖原位置的数据,这意味着shred无法可靠地对文件系统中的常规文件进行操作。

一般来说,命令shred处理设备比处理文件更可靠,因为避开了上面提到的文件系统设计的问题。然而,即使是用shred处理设备也并非总是完全可靠的。例如,大多数磁盘将坏扇区映射为应用程序不可见;如果坏扇区包含敏感数据,则shred将无法销毁它。

命令shred不会尝试检测或报告此问题,就像它不会尝试对备份做任何事情一样。但是,由于处理设备比处理文件更可靠,因此默认情况下shred不会取消分配或删除输出文件。此默认设置更适用于通常无法取消分配且不应删除的设备。

最后,考虑备份和镜像的风险。文件系统备份和远程镜像可能包含无法删除的文件副本,这导致碎片文件可以进行恢复。因此,如果你想要使用shred销毁数据,请确保它没有备份或镜像。

命令支持的选项及含义

-f, –force
必要时覆盖文件权限以允许覆盖文件数据。

-n number, –iterations=number
默认情况下,命令shred进行3次覆盖。你可以减少这个次数来以节省时间,或者如果可以适当增加这个次数。在25次重写后,所有内部重写模式都将至少使用一次。

–random-source=file
使用file作为用于覆盖时的随机数据源,并选择传递顺序。请参阅「随机源」。

-s bytes, –size=bytes
切碎文件的前bytes字节。默认是粉碎整个文件。bytes后面可以跟一个表示大小的单位,如’K’,’M’,’G’来指定一个倍数。请参阅「块大小」。

-u, –remove[=how]
碎化文件后,取消分配(如果可能),然后将其删除。如果文件有多个链接,则只删除参数中指定的链接。

文件名通常没有文件数据敏感,在这种情况下,长选项(–remove)支持的可选参数how用于控制如何更有效地删除每个目录条目:

  • unlink:将仅使用标准的unlink(2)调用;
  • wipe:同时会先模糊文件名中的字节;
  • wipesync:同时会将文件名中的每个混淆字节同步到磁盘。注意,’wipesync’是默认方法,但可能很代价高,需要为每个文件中的每个字符进行同步。对于许多文件,这可能会变得很重要,或者如果你的文件系统提供同步元数据更新。

-v, –verbose
随着处理的进行,将所有的状态更新显示到标准错误中。

-x, –exact
默认情况下,命令shred将常规文件的大小四舍五入到文件系统的块大小的下一个倍数,以完全擦除文件最后一个块中的松弛空间。例如,该空间可以包含某些系统上的当前系统存储器的部分。

使用–exact来抑制该行为。因此,默认情况下,如果在大小为512字节块的系统上粉碎10字节的常规文件,则生成的文件将为512字节长。使用此选项,shred不会增加文件的实际大小。

-z, –zero
通常,shred的最后一次写入由随机数据组成。如果这在你的硬盘驱动器上显而易见(例如,因为它看起来像加密数据),或者你只是认为它更整洁,则–zero选项会添加一轮覆盖,使用的是零字节。该轮覆盖不包含在–iterations选项指定的次数中。

–help
显示帮助并退出。

–version
显示版本信息。

退出状态

0 表示成功

>0 表示失败

使用示例

你可以使用以下命令擦除软盘上所有数据。该命令需要大约20分钟来擦除大小为“1.44MB”(实际上是1440 KiB)软盘:

# shred –verbose /dev/fd0

同样,要擦除硬盘的指定分区上的所有数据,你可以使用如下命令:

# shred –verbose /dev/sda5

在现代磁盘上,一轮覆盖应该足够了,它花费的时间是默认的3次覆盖的三分之一:

# shred –verbose -n1 /dev/sda5

为了安全起见,使用至少执行一次伪随机数据的覆盖,即不要试图使用’-n0 –zero’,以防某些磁盘控制器对写入全零块的优化,而导致不会清除块中的所有字节。有些SSD可能就是这么做的。

参数file为“-”表示标准输出。这样做的目的是粉碎删除的临时文件。例如

i=$(mktemp)

exec 3<>”$i”

rm — “$i”

echo “Hello, world” >&3

shred – >&3

exec 3>-

然而,命令shred – >file不会处理文件的内容,因为Shell会在调用shred之前截断文件。使用命令shred file或(如果使用与Bourne兼容的Shell)命令shred – 1<>file

相关手册

查看在线手册:http://www.gnu.org/software/coreutils/shred

查看info手册:info ‘(coreutils) shred invocation’

参考文献

  • man 1 shred, version GNU coreutils 8.28

更新日志

  • 06/26/2018 创建文章