#!/bin/bash
# blotout.sh: 파일의 모든 기록 지우기.
# 이 스크립트는 대상 파일을 지우기 전에
#+ 임의의 바이트들로 덮어쓰고, 0으로 덮어쓰기를 반복합니다.
# 이렇게 하고 나면, 디스크 섹터를 물리적으로 검사해도
#+ 원래의 파일 데이타를 찾아 낼 수 없습니다.
PASSES=7 # 파일 조각(file-shredding) 단계.
BLOCKSIZE=1 # /dev/urandom 으로 I/O 를 할 때 필요한 유닛 블럭 크기.
#+ 이 크기가 지정되지 않으면 이상한 결과가 나옵니다.
E_BADARGS=70
E_NOT_FOUND=71
E_CHANGED_MIND=72
if [ -z "$1" ] # 파일이 지정되지 않았음.
then
echo "사용법: `basename $0` filename"
exit $E_BADARGS
fi
file=$1
if [ ! -e "$file" ]
then
echo "\"$file\" 파일을 찾을 수 없음."
exit $E_NOT_FOUND
fi
echo; echo -n "\"$file\" 파일을 정말로 완전히 지워 버리겠습니까(y/n)? "
read answer
case "$answer" in
[nN]) echo "하기 싫다구요?"
exit $E_CHANGED_MIND
;;
*) echo "\"$file\" 파일을 완전히 지우는 중.";;
esac
flength=$(ls -l "$file" | awk '{print $5}') # 5 번째 필드가 파일 길이.
pass_count=1
echo
while [ "$pass_count" -le "$PASSES" ]
do
echo "$pass_count 번째 단계"
sync # 버퍼 플러쉬.
dd if=/dev/urandom of=$file bs=$BLOCKSIZE count=$flength
# 파일을 임의의 바이트들로 덮어씀.
sync # 다시 버퍼 플러쉬.
dd if=/dev/zero of=$file bs=$BLOCKSIZE count=$flength
# 파일을 0으로 덮어씀.
sync # 또 다시 버퍼 플러쉬.
let "pass_count += 1"
echo
done
rm -f $file # 마지막으로, 온통 뒤섞이고 조각나 버린 파일을 삭제.
sync # 마지막 버퍼 플러쉬.
echo "\"$file\" 파일이 완전히 삭제되었습니다."; echo
# 이 스크립트는 파일을 완전히 "조각내는데"(shredding) 비효율적이고 느린 방법을
#+ 쓴 것만 빼면 정말 안전합니다. GNU "fileutils" 패키지중의 하나인
#+ "shred" 명령어도 똑같은 일을 하지만 좀 더 효율적입니다.
# 이 스크립트로 지워진 파일은 일반적인 방법으로는 "undelete"되거나
#+ 복구해 낼 수 없습니다.
# 하지만...
#+ 이런 간단한 방법은 과학적인 분석(forensic analysis)까지 막아내지는 못합니다.
# Tom Vier의 "wipe" 파일 삭제 패키지는 이 간단한 스크립트보다 좀 더
#+ 완전하게 파일을 지워 줍니다.
# http://www.ibiblio.org/pub/Linux/utils/file/wipe-2.0.0.tar.bz2
# 파일 삭제와 보안에 대해서 좀 더 자세하게 알고 싶다면,
#+ Peter Gutmann의 논문을 참고하기 바랍니다.
#+ "Secure Deletion of Data From Magnetic and Solid-State Memory".
# http://www.cs.auckland.ac.nz/~pgut001/secure_del.html
exit 0
Posted by ⓒ쟁이™


