如何递归地粉碎整个目录树?

Ste*_* V. 56 security rm data-destruction

我有一个目录树,我想用 Linux 'shred' 实用程序对其进行粉碎。不幸的是,shred 没有-R递归粉碎的选项。

如何递归地粉碎整个目录树?

jam*_*man 55

使用find命令shred递归执行:

find <dir> -type f -exec shred {} \;
Run Code Online (Sandbox Code Playgroud)

  • 使用 `-exec shred {} +` 使​​其更快,因为 shred 接受多个参数。 (4认同)
  • 将其更改为“-exec shred --remove=wipe {} +”也会尝试删除文件名 - 尽管仍然需要注意的是,很难确定某些东西是否真的从现代文件系统和存储设备中消失了。 (2认同)
  • 添加到 @poolie 的评论中,“--remove=wipesync”将执行擦除的操作,但另外还确保混淆的字节同步到磁盘。这可能会更昂贵,但可以确保不会留下任何东西(请记住 shred 的免责声明)。请注意,如果您提供“-u”,则“wipesync”是默认行为。(基于shred版本8.31) (2认同)

use*_*own 31

小心碎!

从切碎联机帮助页:

注意:请注意,shred 依赖于一个非常重要的假设:文件系统将数据覆盖到位。这是传统的做事方式,但许多现代文件系统设计并不满足这一假设。以下是 shred 在其上无效或不保证在所有文件系统模式下都有效的文件系统示例:

  • 日志结构或日志文件系统,例如随 AIX 和 Solaris(以及 JFS、ReiserFS、XFS、Ext3 等)提供的文件系统

  • 写入冗余数据并在某些写入失败时继续执行的文件系统,例如基于 RAID 的文件系统

  • 制作快照的文件系统,例如 Network Appliance 的 NFS 服务器

  • 缓存在临时位置的文件系统,例如 NFS 版本 3 客户端

  • 压缩文件系统

在 ext3 文件系统的情况下,上述免责声明仅在 data=journal 模式下适用(因此 shred 的有效性有限),该模式除了元数据之外还记录文件数据。在 data=ordered(默认)和 data=writeback 模式下,shred 照常工作。可以通过将 data=something 选项添加到 /etc/fstab 文件中特定文件系统的挂载选项来更改 Ext3 日志模式,如挂载手册页 (man mount) 中所述。

此外,文件系统备份和远程镜像可能包含无法删除的文件副本,这将允许以后恢复粉碎的文件。

此外,SSD可能会阻止您覆盖数据的尝试。

解决方案:使用加密的文件系统,然后删除您的文件。

  • 这是一个糟糕的解决方案。加密的文件系统只有在锁定(并因此卸载)时才是安全的。一旦您的操作系统启动并运行,数据就可以获取。 (8认同)
  • @oleks:使用`shred` 和数据加密都可以防止从离线存储设备(想想盗窃或警察)读取数据,而数据加密具有保护所有文件的额外好处,而不仅仅是(正确)删除的文件。一旦文件系统被挂载,在任何一种情况下,我们都会回到良好的 ol' unix 权限,数据保护再次成为操作系统安全和适当系统管理的任务。在保护静态数据方面,前期文件系统加密**绝对不会比战略性使用 `shred` 差! (3认同)
  • 这并没有真正回答这个问题,这个问题是关于那些已经拥有想要粉碎的文件的人的。 (3认同)

Coo*_*kie 23

请改用安全删除。

sudo apt-get install secure-delete
srm -r pathname
Run Code Online (Sandbox Code Playgroud)

完毕。安全删除比 shred 更偏执,使用 38 次而不是 3 次。要进行快速单次传递,请使用

srm -rfll pathname
Run Code Online (Sandbox Code Playgroud)

fll 为您提供了一个不太随机的数据生成器,并且只有一次通过。


小智 12

将此答案与使用此堆栈溢出链接“在 CentOS 上永久安全地删除文件”的最知名选项相结合:

find <directory> -depth -type f -exec shred -v -n 1 -z -u {} \;
Run Code Online (Sandbox Code Playgroud)

编辑:请注意,粉碎单个文件的最佳答案会强制同步,在删除文件之前将更改写入媒体,因为某些或所有日志文件系统具有缓冲区。

如果可能, find 命令应该在运行的文件上调用 shell 脚本:

shred -v -n 1 /path/to/your/file #overwriting with random data
sync #forcing a sync of the buffers to the disk
shred -v -n 0 -z -u /path/to/your/file #overwriting with zeroes and remove the file
Run Code Online (Sandbox Code Playgroud)

在每个文件上。

  • shred 在每次通过后已经执行了 fsync(2)。正是因为您需要在下一次传递之前强制文件更改到达磁盘。 (5认同)

Ale*_*der 6

find [dirname] -depth -type f -exec shred -n1 {} \;
Run Code Online (Sandbox Code Playgroud)

这将对目录 [dirname] 中的文件执行深度优先搜索,然后shred -n1对每个文件运行该命令。删除文件和/或目录时,添加-depth为默认值是一个好习惯,尽管在这种情况下并不是严格需要的。rm -rf当使用而不是运行此类命令时shred-depth需要确保在尝试删除目录内容之前不会删除目录(从而导致错误)。


小智 5

find /your/directory -exec shred {} \;
Run Code Online (Sandbox Code Playgroud)