Книга: Искусство программирования на языке сценариев командной оболочки

Пример 12-42. Надежное удаление файла

Пример 12-42. Надежное удаление файла

#!/bin/bash

# blotout.sh: Надежно удаляет файл.

# Этот суенарий записывает случайные данные в заданный файл,

#+ затем записывает туда нули и наконец удаляет файл.

# После такого удаления даже анализ дисковых секторов

#+ не даст ровным счетом ничего.

PASSES=7 # Количество проходов по файлу.

BLOCKSIZE=1 # операции ввода/вывода в/из /dev/urandom требуют указания размера блока,

#+ иначе вы не получите желаемого результата.

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

# Заполнить файл нулями.

sync # Снова вытолкнуть буферы.

let "pass_count += 1"

echo

done

rm -f $file # Наконец удалить изрядно "подпорченный" файл.

sync # Вытолкнуть буферы в последний раз.

echo "Файл "$file" уничтожен."; echo

# Это довольно надежный, хотя и достаточно медленный способ уничтожения файлов.

#+ Более эффективно это делает команда "shred",

#+ входящая в состав пакета GNU "fileutils".

# Уничтоженный таким образом файл, не сможет быть восстановлен обычными методами.

# Однако...

#+ эта метода вероятно НЕ сможет противостоять аналитическим службам

#+ из СООТВЕТСТВУЮЩИХ ОРГАНОВ

# Tom Vier разработал пакет "wipe", который более надежно стирает файлы

#+ чем этот простой сценарий.

# http://www.ibiblio.org/pub/Linux/utils/file/wipe-2.0.0.tar.bz2

# Для более глубоко изучения проблемы надежного удаления файлов,

#+ рекомендую обратиться к cnfnmt Peter Gutmann,

#+ "Secure Deletion of Data From Magnetic and Solid-State Memory".

# http://www.cs.auckland.ac.nz/~pgut001/pubs/secure_del.html

exit 0

od

Команда od (octal dump) производит преобразование ввода (или файла) в один или несколько форматов, в соответствии с указанными опциями. При отсутствии опций используется восьмеричный формат (опция -o). Эта команда полезна при просмотре или обработке файлов с двоичными данными, например /dev/urandom. См. Пример 9-26 и Пример 12-10.

hexdump

Выводит дамп двоичных данных из файла в восьмеричном, шестнадцатиричном, десятичном виде или в виде ASCII. Эту команду, с массой оговорок, можно назвать эквивалентом команды of od.

objdump

Отображает содержимое исполняемого или объектного файла либо в шестнадцатиричной форме, либо в виде дизассемблерного листинга (с ключом -d).

bash$ objdump -d /bin/ls

/bin/ls: file format elf32-i386

Disassembly of section .init:

080490bc <.init>:

80490bc: 55 push %ebp

80490bd: 89 e5 mov %esp,%ebp

. . .

mcookie

Эта команда создает псевдослучайные шестнадцатиричные 128-битные числа, так называемые "magic cookie", обычно используется X-сервером в качестве "сигнатуры" авторизации. В сценариях может использоваться как малоэффективный генератор случайных чисел.

random000=`mcookie | sed -e '2p'`

# 'sed' удаляет посторонние символы.

Конечно, для тех же целей, сценарий может использовать md5.

# Сценарий вычисляет контрольную сумму для самого себя.

random001=`md5sum $0 | awk '{print $1}'`

# 'awk' удаляет имя файла.

С помощью mcookie можно создавать "уникальные" имена файлов.

Оглавление книги


Генерация: 1.307. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз