Python 3.6中的文件Scrubber:有可能吗?

时间:2017-02-20 05:03:00

标签: python windows file-io hard-drive python-3.6

文件在"删除"后仍然存在于磁盘上或者"永久删除。"有些人可能不希望文件持久存在。为此,我写了这个:

#!/usr/bin/python3
from os.path import isfile, getsize
from os import remove
from secrets import randbits
from math import floor

filename: str
while True :
    filename = input('File: ')
    if filename.lower().strip() in ('', 'none', 'quit') :
        exit()
    elif isfile(filename.strip()) :
        filename = filename.strip()
        print()
        break
    else :
        print('\a')

iterations: int
while True :
    try :
        iterations = int(input('Number of iterations: ').strip())
        assert iterations > 0
        break
    except :
        print('\a')

file_size: int
try :
    file_size = getsize(filename)
except :
    print('No access.')
    exit()

for x in range(iterations) :
    y = floor(x / iterations * 100)
    print(f"{y:>02}%\r", end='')
    try :
        file = open(filename, 'wb+')
        file.write(bytes(randbits(8) for _ in range(file_size)))
    except :
        print('Access interrupted on {}%.'.format(y) if x else 'No access.')
        exit()
    finally :
        try :
            file.close()
        except NameError :
            pass

try :
    file = open(filename, 'rb')
    read = file.readall()
    file.close()
    #
    file = open(filename, 'wb+')
    file.write(bytes(randbits(8) ^ read[x] for x in range(file_size)))
    file.close()
    #
    remove(filename)
except :
    print('No access.')
    exit()
finally :
    try :
        if not file.closed : file.close()
    except :
        pass

print('Done.')

请注意,这可能是黑色艺术。我在写二进制模式下使用直接磁盘访问来首先使用加密随机字节覆盖磁盘上的文件若干次,然后使用一个随机字节的服务对结果文件进行异或,最后我删除文件。

我的问题是:" wb +"直接写在分配给文件的物理磁盘的物理位置的内容?

2 个答案:

答案 0 :(得分:1)

  

" wb +"直接写在分配给文件的物理磁盘的物理位置的内容?

不,在多个级别上。

目前使用的几乎所有操作系统都具有磁盘读写缓存机制,以提高速度。因此,可能需要一段时间才能将数据实际发送到磁盘。 在某些操作系统including ms-windows上,您可以禁用写入缓存,但写入性能将受到相当大的影响

此外,大多数现代硬盘也有内置缓存。这由设备的固件控制,对操作系统不可见。所以即使它来自操作系统的命令告诉驱动器写一些东西返回,这并不能保证写入实际上已经完成。

此外,某个地方应该存在相关文件的备份。你也必须找到并擦除它们。

顺便说一句,在现代硬盘驱动器上,用零覆盖一次文件就足够了。请参阅data remanence上的维基百科文章。

答案 1 :(得分:0)

  

使用文件对象时,“wb +”模式是否直接写入分配给文件的物理磁盘的物理位置中的内容?

在POSIX中,不保证任意文件系统。但是,它可能适用于某些固定安装选项的固定实现。

参见例如shred(7)

  

注意:请注意,shred依赖于一个非常重要的假设:那          文件系统将数据覆盖到位。这是传统的          做事的方式,但许多现代文件系统设计不满足          这个假设。以下是文件系统的示例          碎片无效或无法保证有效          文件系统模式:

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

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

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

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

  •   
  • 压缩文件系统

  •   
     

对于ext3文件系统,上述免责声明适用(和          因此,仅在数据=日志模式中,shred的效果有限          除了元数据之外,哪些期刊还提供数据。在两者中          data = ordered(默认)和data = writeback模式,shred作为          通常。可以通过添加Ext3日志模式来更改          data =特定文件的挂载选项的某些选项          / etc / fstab文件中的系统,如mount man页面中所述          (男人坐骑)。

您还可以查看shred.c