Чтение онлайн

ЖАНРЫ

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

Купер Мендель

Шрифт:

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 можно создавать "уникальные" имена файлов.

Пример 12-43. Генератор имен файлов

#!/bin/bash

# tempfile-name.sh: Генератор имен временных файлов

BASE_STR=`mcookie` # 32-символьный (128 бит) magic cookie.

POS=11 # Произвольная позиция в строке magic cookie.

LEN=5 # $LEN последовательных символов.

prefix=temp # В конце концов это временный ("temp") файл.

suffix=${BASE_STR:POS:LEN}

# Извлечь строку, длиной в 5 символов, начиная с позиции 11.

temp_filename=$prefix.$suffix

# Сборка имени файла.

echo "Имя временного файла = \"$temp_filename\""

# sh tempfile-name.sh

# Имя временного файла = temp.e19ea

exit 0

units

Эта утилита производит преобразование величин из одних единиц измерения в другие. Как правило вызывается в интерактивном режиме, ниже приводится пример использования units в сценарии.

Пример 12-44. Преобразование метров в мили

#!/bin/bash

# unit-conversion.sh

convert_units # Принимает в качестве входных параметров единицы измерения.

{

cf=$(units "$1" "$2" | sed --silent -e '1p' | awk '{print $2}')

# Удаляет все кроме коэффициентов преобразования.

echo "$cf"

}

Unit1=miles

Unit2=meters

cfactor=`convert_units $Unit1 $Unit2`

quantity=3.73

result=$(echo $quantity*$cfactor | bc)

echo "В $quantity милях $result метров."

Поделиться с друзьями: