2013-07-03 3 views
5

어떻게 파이썬을 사용하여 파일을 안전하게 제거 할 수 있습니까? os.remove(path) 함수는 디렉토리 항목 만 제거하지만 "안전한 빈 휴지통"과 같은 파일을 안전하게 제거하려면 무작위로 파일을 덮어 씁니다. 파일. 이 기능을 사용하여 파일을 안전하게 제거하는 기능은 무엇입니까?파이썬은 파일을 안전하게 제거합니다

+1

이것은 프로그래밍 언어의 기능이 아닙니다. 이것은 파일 시스템/운영 체제/저장 장치의 기능입니다. – Elazar

+0

IIRC, Secure Erase Trash가 실제로하는 일은 모든 파일의 연결을 해제 한 다음 즉시 단일 패스 임의 삭제를 수행 한 다음 백그라운드에서 표준 35 패스 삭제를 시작하는 것입니다. – abarnert

답변

7

srm을 사용하면 파일을 안전하게 제거 할 수 있습니다. 파이썬의 os.system() 함수를 사용하여 srm을 호출 할 수 있습니다.

+0

고맙습니다. 나는 대답을 수락 할 것입니다. –

+2

모든 일반적인 이유 때문에'os.system'보다는'subprocess.check_call'을 사용할 것입니다. 셸을 생성 할 때 성능 저하, 하이재킹 가능성 등을 필요로하지 않으므로 수동으로 수행하는 것을 잊어 버리는 것보다 자동으로 호출이 성공했는지를 자동으로 확인하고 그렇지 않은 경우 파일을 안전하게 지운 것으로 간주하는 것이 좋습니다 . – abarnert

+1

이것은 잘 복무했습니다. 감사. – chilliefiber

5

파일을 임의의 데이터로 반복적으로 덮어 쓰고 삭제할 수있는 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에 포격하지만, 빠른 될 가능성이 높습니다.

+0

좋은 생각인데,'os.urandom (n)'대신'random.seed()'를 사용하는 것이 유리합니다. –

+1

'os.urandom'은 더 많은 것을 얻을 수 있기 때문에 더 빠를 것입니다 한 번에 한 바이트 이상. 모든 임의의 데이터를 메모리에 보유 할 필요가 없도록 한 번에 256K에서 1MB 정도의 무작위 데이터를 청크로 생성하려고합니다. 아마'srm'만큼 빨라질 것입니다. – kindall

+0

이것은'srm'을 사용하는 것만 큼 안전하지는 않을 것이며, 거의 빠르지 않을 수도 있습니다. Gutman 알고리즘은 좋은 이유로 수십 년 동안 표준화되었습니다. 그리고 일부 플랫폼에서는'srm'이 일부 하드 드라이브에 내장 된 "Secure Erase"를 이용할 것입니다. – abarnert

4

srm을 사용할 수 있습니다. 물론 파이썬으로 쉽게 구현할 수 있습니다. 파일 내용을 덮어 쓸 데이터는 wikipedia을 참조하십시오. 실제 스토리지 기술에 따라 데이터 패턴이 상당히 다를 수 있음을 확인하십시오. 또한 파일이 log-structured file system 또는 btrfs와 같이 copy-on-write 최적화를 사용하는 파일 시스템에도있는 경우 사용자 공간의 목표는 unachievable 일 수 있습니다.

파일을 저장하는 데 사용 된 디스크 영역을 매시 한 다음 os.remove()과 함께 파일 핸들을 제거하십시오.

파일 이름의 흔적을 지우려면 디렉토리의 inode 구조 (선형, btree, 해시 등)에 따라 다르지만 동일한 디렉토리에 무작위로 명명 된 파일을 할당하고 재 할당 할 수 있습니다. .) 실제로 오래된 파일 이름을 실제로 덮어 쓰는 것을 보장하는 것은 매우 어려울 수 있습니다.

+1

+1.그러나 커널/libc/fs에서 제공하는 특별한 API를 사용해야 만 사용자 공간에서 안전한 지우기를 수행 할 수있는 플랫폼/파일 시스템이 있습니다. 즉'srm '을 사용하면 효과가 있지만 Python으로 작성하는 것은 아닙니다 (특수 API를 ctypes하지 않는 한). – abarnert

+1

한편, 여러분의 플랫폼 (또는 적어도'srm'에있는 플랫폼을 가지고 있지 않은 플랫폼)의'srm'을 살펴볼 가치가 있습니다. 예를 들어, [OS X 10.8] (http://www.opensource.apple.com/source/srm/srm-7/srm/src/)의 소스는 C를 아는 경우 매우 간단하며' fts' (파이썬의'os.walk'와 같습니다); 거기에 거의 아무 것도 힘들지 않습니다. – abarnert

관련 문제