Вот от нечего делать наколбасил скрипт на bash о назначение которого можно узнать из комментариев. Собственно скрипт имеет "ограниченную" пригодность ввиду скорости выполнения (Опять же читаем комантарии), однако представяет собой интерес в виде примера использования. Представляю на суд общественности, приветствуются советы по улучшению скорости, качества и т.п Короче, обсуждаем. Code: #!/bin/bash hell=( ' shred.sh: wiper by ShadOS [Hell Knights Crew]\n' '//-------------------------------------------\n' ' The Mainest Evil of Runet \n' ' _ _ _ _ _ __ _ _ _ \n' ' | || |___| | | |/ /_ _ (_)__ _| |_| |_ ___ \n' ' | __ / -_) | | . <| . \| / _. | . \ _(_-< \n' ' |_||_\___|_|_|_|\_\_||_|_\__. |_||_\__/__/ \n' ' hellknights.void.ru |___/ .0x48k. \n' ' shados.0x48k.cc .ShadOS. \n' '//-------------------------------------------\n' ) # Этот сценарий записывает случайные данные в заданный файл, #+ затем записывает туда нули и наконец удаляет файл. # После такого удаления даже анализ дисковых секторов #+ не даст ровным счетом ничего. # Это довольно надежный, хотя и достаточно медленный способ уничтожения файлов. #+ Более эффективно это делает команда "shred", #+ входящая в состав пакета GNU "fileutils". #Далее привожу выдержку из man shred из состава GNU "fileutils" #ВНИМАНИЕ: Помните, что shred полагается на очень важное предположение: #что ваша файловая система перезаписывает файлы "на месте". #Традиционно это так и делается, но многие современные файловые системы #не удовлетворяют этому предположению. Вот примеры файловых систем, на #которых shred не эффективен или не дает гарантии эффективности во всех #режимах файловой системы: #* log-structured or journaled file systems, such as those supplied with #AIX and Solaris (and JFS, ReiserFS, XFS, Ext3, etc.) #* file systems that write redundant data and carry on even if some writes #fail, such as RAID-based file systems #* file systems that make snapshots, such as Network Appliance's NFS server #* file systems that cache in temporary locations, such as NFS #version 3 clients #* compressed file systems #In the case of ext3 file systems, the above disclaimer applies #(and shred is thus of limited effectiveness) only in data=journal mode, #which journals file data in addition to just metadata. In both the #data=ordered (default) and data=writeback modes, shred works as usual. #Ext3 journaling modes can be changed by adding the data=something option #to the mount options for a particular file system in the /etc/fstab file, #as documented in the mount man page (man mount). #Конец выдержки # Уничтоженный таким образом файл, не сможет быть восстановлен обычными методами. # Однако... #+ эта метода вероятно НЕ сможет противостоять аналитическим службам #+ из СООТВЕТСТВУЮЩИХ ОРГАНОВ # 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/pubs/secure_del.html # Также рекомендуем обратиться к моей статье за дополнительной информацией. # http://hellknights.void.ru/articles/0x48k-Cleaners.htm BLOCKSIZE=1 # операции ввода/вывода в/из /dev/urandom требуют указания размера блока, #+ иначе вы не получите желаемого результата. E_BADARGS=70 E_NOT_FOUND=71 E_CHANGED_MIND=72 val=( "\x55" "\xAA" "\x92" "\x49" "\x24" "\x00" "\x11" "\x22" "\x33" "\x44" "\x55" "\x66" "\x77" "\x88" "\x99" "\xAA" "\xBB" "\xCC" "\xDD" "\xEE" "\xFF" "\x55" "\xAA" "\x92" "\x00" "\x49" "\x24") RANDOM=$$ # Инициализация генератора случайных чисел числом PID процесса-сценария. PIPS=256 # Значения от 0 до 256 #echo "${#val}" #Длинна массива #echo "${#val[*]}" #Количество элементов массива #echo -e "${val[@]}" #Вывод массива hexcvt () { BASE=16 if [ -z "$1" ] then echo 0 return # "Return" 0, если функции не был передан аргумент. fi echo ""$1" "$BASE" o p" | dc # "o" устанавливает основание системы счисления для вывода. # "p" выводит число, находящееся на вершине стека. # См. 'man dc'. return } random_fill() { if [ $gen="rnd" ] # rnd, иначе /dev/urandom по-умолчанию then for ((j=$flength; j > 0 ; j--)) do let "die1 = RANDOM % $PIPS" die1=`hexcvt $die1` die1=`echo "\x""$die1"` echo -ne $die1 >> $file done else dd if=/dev/urandom of=$file bs=$BLOCKSIZE count=$flength fi } usage () { echo -e "Порядок использования: `basename $0` <filename> <visr|bs|pg> <rnd|dev>" echo -e "\tАлгоритмы:" echo -e "\t visr - VISR" echo -e "\t bs - Брюса Шнайера" echo -e "\t pg - Питера Гутмана" echo -e "\tГенераторы псевдослучайных последовательностей:" echo -e "\t rnd - \$RANDOM (быстро, предсказуемей, по-умолчанию)" echo -e "\t dev - /dev/urandom (медленней, надёжней)" exit $E_BADARGS } clear echo -en '\E[34;40m'"\033[1m${hell[@]}\033[0m" if [ -z "$3" ] # Имя файла, генератор и алгоритм не указан. then usage fi file=$1 alg=$2 gen=$3 if [ ! -e "$file" ] then echo "Файл \"$file\" не найден." exit $E_NOT_FOUND fi echo; echo -ne "Вы уверены в том, что желаете \033[1mуничтожить\033[0m \"$file\" по алгоритму \"$2\" (y/n)? " read answer case "$answer" in [nN]) echo "Передумали? Операция отменена." exit $E_CHANGED_MIND ;; *) echo -e "\033[1mУничтожается\033[0m файл \"$file\".";; esac stime=$(date +%H%M%S%N) echo "Запущен в $(date +%H:%M:%S.%N)" flength=$(ls -l "$file" | awk '{print $5}') # Поле с номером 5 - это длина файла. cat /dev/null > $file # Переходим в начало файла echo case "$alg" in visr | VISR) #Затираем по алгоритму VISR pass_count=0 for i in 1 2 3 do let "pass_count += 1" echo "Проход $pass_count" dd if=/dev/zero of=$file bs=$BLOCKSIZE count=$flength sync cat /dev/null > $file # Переходим в начало файла let "pass_count += 1" echo "Проход $pass_count" for ((j=$flength; j > 0; j--)) do echo -ne "\xFF" >> $file done sync cat /dev/null > $file # Переходим в начало файла done let "pass_count += 1" echo "Проход $pass_count" for ((j=$flength; j > 0; j--)) do echo -ne "\xAA" >> $file done sync ;; bs | BS) #Затираем по алгоритму Брюса Шнайера pass_count=1 echo "Проход $pass_count" for ((i=$flength; i > 0; i--)) do echo -ne "\xFF" >> $file done sync cat /dev/null > $file # Переходим в начало файла let "pass_count += 1" echo "Проход $pass_count" dd if=/dev/zero of=$file bs=$BLOCKSIZE count=$flength sync cat /dev/null > $file # Переходим в начало файла for i in 3 4 5 6 7 do let "pass_count += 1" echo "Проход $pass_count" random_fill sync cat /dev/null > $file # Переходим в начало файла done;; pg | PG) #Затираем по алгоритму Питера Гутмана pass_count=0 for i in 1 2 3 4 do let "pass_count += 1" echo "Проход $pass_count" random_fill sync cat /dev/null > $file # Переходим в начало файла done for ((i=0; i < ${#val[*]} ; i++)) do let "pass_count += 1" echo "Проход $pass_count" for ((j=$flength; j > 0 ; j--)) do echo -ne "${val[i]}" >> $file done sync cat /dev/null > $file # Переходим в начало файла done for i in 32 33 34 35 do let "pass_count += 1" echo "Проход $pass_count" random_fill sync cat /dev/null > $file # Переходим в начало файла done;; *) #Для некорректного ввода echo "Алгоритм был задан некорректно!" usage esac rm -f $file # Наконец удалить изрядно "подпорченный" файл. sync # Вытолкнуть буферы в последний раз. let "stime=$(date +%H%M%S%N)-stime" echo $stime echo "Остановлен в $(date +%H:%M:%S.%N)" echo -e "Файл \"$file\" \033[1mуничтожен\033[0m."; echo echo -e "\a" exit 0
Неплохой сценарий, только мне кажется, что гораздо удобнее было бы переписать его на Си и поставлять в двух вариантах - исходниках и бинарном файле. Чтобы без лишних телодвижений можно было писать в консоль ./shred [параметры] Тогда будет и быстрее и удобнее.
Хм... так нечно подобное в виде бинарников уже есть. Вы комменты к скрипту внимательно почитайте. Вот примеры с исходниками: http://www.ibiblio.org/pub/Linux/utils/file/wipe-2.2.0.tar.bz2 Помимо этого есть ещё проприетарный BCWipe для всех осеновных *nix систем и для Win. Я им долгое время пользовался. Найти можно на www.jetico.com. Ещё можно GNU Shred из состава fileutils попробовать. Мой сценарий - это всего лишь эксперимент и хороший пример сценария на bash, но, скорее всего, не для реального использования в боевых условиях.
ShadOS Я имел в виду версию в виде одиного маленького бинарника, именно для боевых условий. Тогда его можно просто везде с собой таскать.
хм... это уже сложнее. А как же проблемы переносимости? Хотя можно попробовать что-нибудь написать =) Спасибо за идею.