Python安全删除文件

时间:2013-07-03 18:10:58

标签: python file erase

如何使用python安全删除文件?函数os.remove(path)仅删除目录条目,但我想安全地删除文件,类似于随机覆盖文件的名为“安全清空垃圾箱”的苹果功能。

使用此方法安全删除文件的功能是什么?

5 个答案:

答案 0 :(得分:11)

您可以使用srm安全删除文件。您可以使用Python的os.system()函数来调用srm。

答案 1 :(得分:6)

您可以非常轻松地在Python中编写一个函数,用随机数据覆盖文件,甚至重复,然后删除它。像这样:

import os

def secure_delete(path, passes=1):
    with open(path, "ba+") as delfile:
        length = delfile.tell()
        for i in range(passes):
            delfile.seek(0)
            delfile.write(os.urandom(length))
    os.remove(path)

然而,对srm的剪切可能会更快。

答案 2 :(得分:6)

您可以使用srm,当然,您始终可以在Python中轻松实现它。有关要覆盖文件内容的数据,请参阅wikipedia。请注意,根据实际存储技术,数据模式可能会有很大差异。此外,如果您的文件位于log-structured file system或甚至位于具有写时复制优化的文件系统(例如btrfs)上,则您的目标可能是来自用户空间的unachievable

完成混搭用于存储文件的磁盘区域后,请使用os.remove()删除文件句柄。

如果您还想删除文件名的任何痕迹,您可以尝试在同一目录中分配和重新分配一大堆随机命名的文件,但这取决于目录inode结构(线性,btree,哈希等)。 )可能很难保证你实际上覆盖了旧文件名。

答案 3 :(得分:0)

因此至少在使用@kindall解决方案的Python 3中,我只能附加它。这意味着文件的整个内容仍然完好无损,并且每次通过都只是增加了文件的整体大小。因此最终成为[原始内容] [该大小的随机数据] [该大小的随机数据] [该大小的随机数据],这显然不是所希望的效果。

虽然这种骗术对我有用。我在append中打开文件以找到长度,然后在r +中重新打开,以便可以开始查找(在append模式下,造成这种不良影响的原因似乎是实际上无法将其查找为0)

所以检查一下:

def secure_delete(path, passes=3):
with open(path, "ba+", buffering=0) as delfile:
    length = delfile.tell()
delfile.close()
with open(path, "br+", buffering=0) as delfile:
    #print("Length of file:%s" % length)
    for i in range(passes):
        delfile.seek(0,0)
        delfile.write(os.urandom(length))
        #wait = input("Pass %s Complete" % i)
    #wait = input("All %s Passes Complete" % passes)
    delfile.seek(0)
    for x in range(length):
        delfile.write(b'\x00')
    #wait = input("Final Zero Pass Complete")
os.remove(path) #So note here that the TRUE shred actually renames to file to all zeros with the length of the filename considered to thwart metadata filename collection, here I didn't really care to implement

取消注释每次通过后检查文件的提示,当我用警告说明文件名不像真实的-zu那样被粉碎时,这看起来不错。

答案 4 :(得分:0)

实施手动解决方案的答案对我不起作用。我的解决方法如下,好像还行。

import os

def secure_delete(path, passes=1):
    length = os.path.getsize(path)
    with open(path, "br+", buffering=-1) as f:
        for i in range(passes):
            f.seek(0)
            f.write(os.urandom(length))
        f.close()