如何递归切碎整个目录树?


47

我想使用Linux“ shred”实用程序来粉碎目录树。不幸的是,切丝没有-R递归切碎的选择。

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

Answers:


45

使用以下find命令来shred递归执行:

find <dir> -type f -exec shred {} \;

如果没有-depth选项,是否可以使用?它可以在现代的日记文件系统上工作吗?
用户未知,

@userunknown不,切细在现代日记文件系统上不起作用。有关更精确的信息,请参阅man shred
FanaticD '16

还要注意,该方法甚至不会尝试删除文件名,因此,这样存储的任何数据肯定会被留下(srm从@Cookie的答案中至少会尝试解决此问题)。
ntninja

使用-exec shred {} +,使其更快,因为一丝一毫接受多个参数。
萨米特

28

当心切碎!

从粉碎的手册中:

注意:请注意,切碎取决于一个非常重要的假设:文件系统会覆盖适当的数据。这是传统的处理方式,但是许多现代文件系统设计都不满足此假设。以下是在其上无效或不能保证在所有文件系统模式下均有效的文件系统示例:

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

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

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

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

  • 压缩文件系统

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

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

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


指针指向+1时,我之前也遇到过类似情况。它不适用于NetApp的NFS。NetApp使用WAFL,并且使用写时复制(包括metajournalling),因此是正确的。同样,在最新的Solaris ZFS中,也有发生碎片的情况。
Nikhil Mulley

6
这是一个不好的解决方案。加密的文件系统只有在锁定(并已卸载)后才是安全的。一旦您的操作系统启动并运行,数据就会被抢购一空。
oleks

3
@oleks:使用shred和数据加密都可以防止从脱机存储设备(认为是盗窃或报警)中读取数据,而数据加密具有保护所有文件(不仅仅是(正确)删除的)文件的附加好处。挂载文件系统后,无论哪种情况,我们都将恢复到良好的unix权限,并且数据保护又成为操作系统安全和适当的系统管理的任务。在保护静态数据方面,前瞻性文件系统加密绝对不会比战略性使用差shred
ntninja

12

请改用安全删除。

sudo apt-get install secure-delete
srm -r pathname

做完了 使用38次传递而不是3次传递,安全删除比切碎要多得多。要执行快速单次传递,请使用

srm -rfll pathname

fll使您的数据生成器的随机性降低,并且只有一次通过。


它可以解决unix.stackexchange.com/a/27075/18886中提到的问题吗?
伊恩·邓恩

怎么可能 否
Cookie Cookie

请注意,此方法比find基于提议的方法具有更多好处,该方法将尝试通过在截断和取消链接之前重命名文件来擦除存储的文件名。
ntninja

@ntninja基于查找的方法使用shred,并且shred在完成删除文件之前会重命名文件。同样的好处对吗?
tuxayo

11

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

find <directory> -depth -type f -exec shred -v -n 1 -z -u {} \;

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

如果可能,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

在每个文件上。


阅读并研究了许多答案后,我发现(imho)这个答案是最彻底的。我只会补充一点,因为切丝不会删除我附加rm -rvf $1到shell脚本的目录(其中$ 1是从{}扩展中传入的/ path / to / your / file find... -exec
JoelAZ 2014年

4
每次通过后,shred已执行fsync(2)。正是因为您需要在下一次传递之前强制文件更改到达磁盘。
安赫尔

depth在这里做什么?同样不确定尾随的反斜杠
放映

5
find /your/directory -exec shred {} \;

赞成,但詹姆斯击败您一分钟,接受了。
史蒂夫五世,

如果没有-depth选项,是否可以使用?它可以在现代的日记文件系统上工作吗?
用户未知,

3
find [dirname] -depth -type f -exec shred -n1 {} \;

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


3
您应该使用shred -N 1,因为默认值是3次,是蛇油。一次就足够了,否则30次将不起作用。
用户未知,

提供简单的命令作为答案并不是回答问题的最佳方法。我建议添加一条简短的解释,说明生产线在做什么以及使用该生产线可能存在的局限性。
n0pe 2011年

0

shred我找到的最彻底的方法(其中也包括目录删除)是find调用一个脚本来拥有shred

  • 覆盖文件
  • 同步
  • 然后删除
  • 最后调用rm删除目录名称。

此方法还可以正确处理文件名中带有空格的文件名。

首先- shred脚本(我已经命名为我,dirShredder.sh并将其存储在/root目录中:

shred -v -n 1 "$1" #overwriting with random data
sync #forcing a sync of the buffers to the disk
shred -v -n 0 -z -u "$1" #overwriting with zeroes and remove the file
rm -rvf "$1" # call rm to remove the directories

然后,像这样调用脚本:

find /volume1/pathToShred/ -mindepth 1 -depth -exec /root/dirShredder.sh "{}" \;

确保将killit.sh文件标记为可执行文件(chmod +x),当然还要更新要切碎的目录的路径,以及dirShredder.sh将其存储在其他位置的路径。

NOTA BENE- shred写时复制文件系统(ZFS,BTRFS等)甚至日记文件系统都有问题。除了“加密文件系统”以外,没有找到一种真正公认的“最佳”方式来处理此问题,但是我不确定这事后的效果如何。
似乎可以得到的最接近的结果是,在切碎操作之后用随机数据覆盖驱动器上的所有空白空间(不是零,这似乎并不总是可靠的。)而且,SSD也可能有其他考虑事项(例如TRIM)。

我不在这里讨论这些,还有其他Stack答案(例如,在此问题中为@user unknown的答案),并且整个网络上都有涉及这些主题的大量讨论,因此如果需要这种安全级别的搜索,请进行搜索。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.