2013-07-03 12 views
5

Wie kann ich sicher eine Datei mit Python entfernen, entfernt die Funktion os.remove(path) nur den Verzeichniseintrag, aber ich möchte die Datei sicher entfernen, ähnlich wie die Apple-Funktion namens "Secure Empty Trash", die zufällig überschreibt Datei. Welche Funktion entfernt sicher eine Datei mit dieser Methode?Python sicher entfernen Datei

+1

Dies ist keine Eigenschaft einer Programmiersprache. Dies ist eine Funktion des Dateisystems/Betriebssystems/Speichergeräts. – Elazar

+0

IIRC, was "Secure Erase Trash" tatsächlich tut, ist das Aufheben der Verknüpfung aller Dateien. Führen Sie dann sofort eine zufällige Löschung in einem Durchgang durch und starten Sie anschließend eine 35-Pass-Standardlöschung im Hintergrund. – abarnert

Antwort

7

Sie können srm verwenden, um Dateien sicher zu entfernen. Sie können die Funktion os.system() von Python verwenden, um srm aufzurufen.

+0

Danke, ich werde deine Antwort akzeptieren. –

+2

Ich würde "subprocess.check_call" anstelle von "os.system" verwenden, aus den üblichen Gründen. Es besteht keine Notwendigkeit für den Leistungseinbruch, das Entführungspotenzial usw. beim Erstellen einer Shell, und es ist besser, automatisch zu überprüfen, ob der Aufruf erfolgreich war, als manuell zu vergessen und anzunehmen, dass Sie sicher gelöschte Dateien haben, wenn Sie dies nicht wirklich getan haben . – abarnert

+1

Das hat mir gut gedient. Vielen Dank. – chilliefiber

5

Sie können sehr einfach eine Funktion in Python schreiben, um eine Datei mit zufälligen Daten zu überschreiben, sogar wiederholt, dann löschen Sie sie. Etwas wie folgt aus:

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) 

zu srm Beschuss aus ist wahrscheinlich schneller sein, aber.

+0

Das ist eine gute Idee, aber gibt es einen Vorteil der Verwendung von 'random.seed()' anstelle von 'os.urandom (n)' –

+1

'os.urandom' wird wahrscheinlich (viel) schneller sein, da Sie mehr bekommen können als ein Byte zu einem Zeitpunkt. Sie möchten die Zufallsdaten in Blöcken (möglicherweise 256 KB bis 1 MB pro Zeiteinheit) generieren, um zu vermeiden, dass alle zufälligen Daten im Speicher gehalten werden müssen. Das wird wahrscheinlich ungefähr so ​​schnell sein wie 'srm'. – kindall

+0

Dies ist nicht annähernd so sicher wie die Verwendung von 'srm', und es kann auch nicht annähernd so schnell sein. Der Gutman-Algorithmus ist seit Jahrzehnten aus gutem Grund standardisiert. Und "srm" auf einigen Plattformen wird das eingebaute "Secure Erase" auf einigen Festplatten nutzen. – abarnert

4

Sie können srm verwenden, sicher, Sie können es immer einfach in Python implementieren. Informationen zum Überschreiben des Dateiinhalts finden Sie unter wikipedia. Beachten Sie, dass Datenmuster je nach tatsächlicher Speichertechnologie sehr unterschiedlich sein können. Wenn sich Ihre Datei auf einem log-structured file system befindet oder sogar auf einem Dateisystem mit Kopieroptimierung, wie btrfs, ist Ihr Ziel möglicherweise unachievable aus dem Benutzerbereich.

Nachdem Sie den Festplattenbereich, in dem die Datei gespeichert wurde, mit dem Maischen versehen haben, entfernen Sie die Dateikennung mit os.remove().

Wenn Sie auch eine Spur des Dateinamens löschen möchten, können Sie versuchen, eine ganze Reihe von zufällig benannten Dateien in demselben Verzeichnis zuzuordnen und neu zuzuordnen, obwohl abhängig von der Verzeichnis - Inode - Struktur (linear, btree, hash usw.) .) Es kann sehr schwierig sein, zu garantieren, dass Sie den alten Dateinamen tatsächlich überschrieben haben.

+1

+1.Beachten Sie jedoch, dass es bei einigen Plattformen/Dateisystemen ein sicheres Löschen aus dem Benutzerbereich gibt, aber nur unter Verwendung einer speziellen API, die vom Kernel/libc/fs bereitgestellt wird. Das bedeutet, dass die Verwendung von 'srm' funktionieren wird, aber nichts, was Sie in Python schreiben (es sei denn, Sie haben die spezielle API" ctypes "). – abarnert

+1

In der Zwischenzeit lohnt es sich, die 'srm' für Ihre Plattform zu betrachten (oder auf einer Plattform, auf der es nicht vorhanden ist, zumindest bei 'srm'). Zum Beispiel ist die Quelle von [OS X 10.8] (http://www.opensource.apple.com/source/srm/srm-7/srm/src/) ziemlich einfach, wenn Sie C überhaupt kennen und 'verstehen fts' (das ist wie Pythons "os.walk"); da ist fast nichts Schwieriges. – abarnert