2013-07-03 14 views
5

Come posso rimuovere in modo sicuro un file utilizzando python, la funzione os.remove(path) rimuove solo la voce di directory, ma voglio rimuovere il file in modo sicuro, simile alla funzione Apple chiamata "Secure Empty Trash" che sovrascrive casualmente il file file. Quale funzione rimuove in modo sicuro un file utilizzando questo metodo?Python rimuove il file in modo sicuro

+1

questa non è una funzionalità di un linguaggio di programmazione. questa è una funzionalità del file system/sistema operativo/dispositivo di archiviazione. – Elazar

+0

IIRC, cosa Secure Erase Trash in realtà non è quello di scollegare tutti i file, poi fare un single-passare la cancellazione casuale immediatamente, poi dare il via una cancellazione 35-pass standard nel fondo. – abarnert

risposta

7

È possibile utilizzare srm per rimuovere i file in modo sicuro. È possibile utilizzare la funzione os.system() di Python per chiamare srm.

+0

Grazie, accetterò la tua risposta. –

+2

Io userei "subprocess.check_call" piuttosto che "os.system", per tutti i soliti motivi. Non è necessario per il colpo di performance, il potenziale di dirottamento, ecc. Nella generazione di una shell, ed è meglio controllare automaticamente che la chiamata sia riuscita piuttosto che dimenticarsi di farlo manualmente e assumere di aver cancellato i file quando non si è veramente sicuri . – abarnert

+1

Questo mi è servito bene. Grazie. – chilliefiber

5

È possibile scrivere facilmente una funzione in Python per sovrascrivere un file con dati casuali, anche ripetutamente, quindi eliminarlo. Qualcosa di simile a questo:

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) 

Sborsare a srm è probabile che sia più veloce, però.

+0

Questa è una buona idea, ma c'è un vantaggio nell'usare 'random.seed()' invece di 'os.urandom (n)' –

+1

'os.urandom' sarà probabilmente (molto) più veloce dato che puoi ottenere di più di un byte alla volta. Ti consigliamo di generare i dati casuali in blocchi (forse da 256K a 1MB alla volta) per evitare di dover tenere tutti i dati casuali in memoria. Probabilmente sarà veloce come 'srm'. – kindall

+0

Questo non sarà quasi sicuro come usare 'srm', e potrebbe anche non essere altrettanto veloce. L'algoritmo di Gutman è stato standardizzato per decenni per una buona ragione. E 'srm' su alcune piattaforme sfrutterà il" Secure Erase "integrato su alcuni dischi rigidi. – abarnert

4

È possibile utilizzare srm, certo, è sempre possibile implementarlo facilmente in Python. Fare riferimento a wikipedia per i dati con cui sovrascrivere il contenuto del file. Osservare che, a seconda della tecnologia di archiviazione effettiva, i modelli di dati possono essere molto diversi. Inoltre, se il file si trova su una log-structured file system o anche su un file system con l'ottimizzazione copy-on-write, come Btrfs, il vostro obiettivo può essere unachievable dallo spazio utente.

Dopo aver eseguito il frullamento dell'area del disco utilizzata per archiviare il file, rimuovere l'handle del file con os.remove().

Se si desidera cancellare qualsiasi traccia del nome del file, è possibile provare ad allocare e riallocare un gruppo di file a caso nella stessa directory, a seconda della struttura di directory inode (lineare, binario, hash, ecc. .) Potrebbe essere molto difficile garantire che si sia sovrascritto il vecchio nome del file.

+1

+1.Si noti che ci sono alcune piattaforme/filesystem in cui si può fare una cancellazione sicura dallo spazio utente, ma solo usando alcune API speciali fornite dal kernel/libc/fs. Il che significa che l'uso di 'srm' funzionerà, ma niente di quello che scriverai in Python (a meno che tu non sia l'API speciale di ctypes). – abarnert

+1

Nel frattempo, probabilmente vale la pena guardare 'srm' per la tua piattaforma (o, su una piattaforma che non ce l'ha, almeno in alcuni' srm'). Ad esempio, la fonte di [OS X 10.8] (http://www.opensource.apple.com/source/srm/srm-7/srm/src/) è piuttosto semplice se si conosce C e si capisce ' fts' (che è come 'os.walk' di Python); non c'è quasi nient'altro che ingannevole. – abarnert

Problemi correlati