我在Linux上。我有一个文件列表,我想用零覆盖它们并删除它们。我尝试使用
srm file1 file2 file3 ...
但它太慢了(我必须覆盖并删除~50 GB的数据)并且我不需要那种安全性(我知道srm会执行大量的传递,而不是使用零传递一次)。< / p>
我知道我可以使用命令
覆盖每个文件cat /dev/zero > file1
然后用rm删除它,但我不能为每个文件手动执行此操作。
是否有像srm这样的命令执行单个零传递,或者是一个脚本可以在文件列表而不是单个文件列表上执行cat /dev/zero
?谢谢。
答案 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
来做到这一点。
以下是我通常使用的选项。
shred -n 3 -z <filename>
-这将进行3次传递,以用随机数据覆盖文件。然后它将进行最后一次遍历,用零覆盖文件。虽然该文件将保留在磁盘上,但是它将所有0
都保留在磁盘上。
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]通过单个命令以这种方式擦除多个文件