如何使用python安全删除文件?函数os.remove(path)
仅删除目录条目,但我想安全地删除文件,类似于随机覆盖文件的名为“安全清空垃圾箱”的苹果功能。
使用此方法安全删除文件的功能是什么?
答案 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()