用零覆盖一系列文件的最简单方法

时间:2014-10-14 16:18:40

标签: file overwrite

我在Linux上。我有一个文件列表,我想用零覆盖它们并删除它们。我尝试使用

srm file1 file2 file3 ...

但它太慢了(我必须覆盖并删除~50 GB的数据)并且我不需要那种安全性(我知道srm会执行大量的传递,而不是使用零传递一次)。< / p>

我知道我可以使用命令

覆盖每个文件
cat /dev/zero > file1

然后用rm删除它,但我不能为每个文件手动执行此操作。

是否有像srm这样的命令执行单个零传递,或者是一个脚本可以在文件列表而不是单个文件列表上执行cat /dev/zero?谢谢。

4 个答案:

答案 0 :(得分:7)

这样的事情,使用stat来获取正确的写入大小,并dd来覆盖文件,可能就是您所需要的:

for f in $(<list_of_files.txt)
do
  read blocks blocksize < <(stat -c "%b %B" ${f})
  dd if=/dev/zero bs=${blocksize} count=${blocks} of=${f} conv=notrunc
  rm ${f}
done

使用/dev/urandom代替/dev/zero来获得(略微)更好的删除语义。

编辑:向conv=notrunc调用添加dd选项,以避免在文件打开时将文件截断,这会导致相关存储在被覆盖之前被释放

答案 1 :(得分:2)

srm的目的是在释放其块之前销毁文件中的数据。

cat /dev/null > file完全不等同srm因为。{ 它不会破坏文件中的数据:块将在原始数据完整的情况下发布。

使用/dev/zero代替/dev/null甚至无效,因为/dev/zero永远不会结束。

将程序的输出重定向到文件将永远不会出现与cat /dev/null给出的相同原因。

您需要一个专用程序来打开给定的文件进行写入,在文件的所有字节上写入零,然后删除该文件。这就是srm所做的。

答案 2 :(得分:2)

我使用shred来做到这一点。

以下是我通常使用的选项。

  1. shred -n 3 -z <filename>-这将进行3次传递,以用随机数据覆盖文件。然后它将进行最后一次遍历,用零覆盖文件。虽然该文件将保留在磁盘上,但是它将所有0都保留在磁盘上。

  2. shred -n 3 -z -u <filename>-与上述类似,但也取消链接(即删除)文件。删除的默认选项是wipesync,它是最安全但也最慢的。 检查手册页以了解更多选项。

注意: -n在这里用于控制用于覆盖随机数据的迭代次数。增加此数字将导致shred操作花费更长的时间才能完成,并且切碎效果更好。我认为3就足够了,但也许是错误的。

答案 3 :(得分:0)

是否有像srm这样的命令,它执行一次零传递,

是的。 SRM使用正确的参数执行此操作。来自man srm: srm -llz

-l降低了安全性。只写了两遍:一种模式 0xff和最终模式随机值。

-l -l第二次提供了更多安全性方面的知识:只有一个 写入随机通行证。

-z使用零而不是随机数据擦除最后一次写入 srm -llzr如果擦除目录,将递归执行此操作。

您甚至可以使用'srm -llz [file1] [file2] [file3]通过单个命令以这种方式擦除多个文件