# с возможным переопределением умолчаний
args='getopt da: c:h $*'
if [$?!= 0]
then
usage
fi
set — $args
for i
do
case '$i'
in
-h)
usage
shift
;;
-a)
AUTHOR='$2'; shift
shift
;;
-c)
COPYRIGHT='$2'; shift
shift
;;
-d)
DEBUG=true
shift
;;
-)
shift; break;;
esac
done
if $DEBUG; then
echo DEBUG MODE ENABLED.
DEBUGCMD=echo
fi
# Проверка наличия минимального количества элементов
# командной строки
if $DEBUG; then echo ITEM COUNT = $#; fi
if [$# — lt '$MINITEMS']; then
usage
fi
# Если первый аргумент особый, запомнить его:
# ТНЕIТЕМ='$1'; shift
# Клонируйте эту строчку для каждого элемента,
# который хотите сохранить.
# Не забудьте при этом откорректировать значение
# переменной MINITEMS.
# Если вы хотите обработать остальные элементы,
# делайте это здесь:
# for i in $*; do
# echo Looky! Looky! I got $i
# done
if [! -z '$COPYRIGHT'];
then
if $DEBUG; then echo Setting copyright to: $COPYRIGHT; fi
CRFLAG='-copyright $COPYRIGHT'
fi
LABEL='date — u +%Y%m%d'
$DEBUGCMD mkisofs — D -l — J -r — L -f — P '$AUTHOR' — V $LABEL $CRFLAG $*
Самый лучший способ научиться сцеплять команды UNIX/Linux в один длинный канал — заглядывать через плечо того, кто этим занимается. Сейчас я попробую научить вас делать это, создав на ваших глазах небольшую утилиту.
♥ Книга «Think UNIX» (Думайте в духе UNIX), Que, — отличный учебник по объединению инструментов UNIX/Linux в длинные команды.
Самой мощной технологией, представленной в UNIX/Linux, является возможность объединить несколько команд аналогично тому, как наращивают садовый шланг для поливки. Если у вас есть программа, которая преобразует входной текст в верхний регистр, и программа, сортирующая строки в файле, то вы можете сцепить их друг с другом. В результате вы получите команду для преобразования строк в верхний регистр и их вывода в заданном порядке. Все, что от вас требуется, — это поставить символ «|» между командами. Выходная информация одной команды поступит на вход следующей:
$ cat
Тем, кто не знаком с UNIX/Linux, сообщу, что cat — это команда, выводящая файл. Программу
Теперь напишем более сложную утилиту. Это будет программа, определяющая, какой компьютер в вашей локальной сети наиболее вероятно заражен червем. Программа будет представлять собой один длинный канал.
Звучит неожиданно? Все, что будет делать наша программа, — это искать подозрительные на заражение компьютеры. Иными словами, она выведет список хостов, нуждающихся в более внимательном осмотре. Тем не менее, ваши коллеги будут удивлены, уверяю вас.
Программа не заменит вам хорошее антивирусное обеспечение, но я выбрал этот пример как хорошую иллюстрацию некоторых рудиментарных приемов программирования оболочки. Кроме того, вы узнаете кое-что новое о работе сетей. Когда мы закончим, в ваших руках будет простой инструмент, которым вы сможете пользоваться для диагностики этой конкретной проблемы в своей сети. С помощью этой программы мне удалось убедить руководство в необходимости купить настоящее антивирусное программное обеспечение.
Каков признак того, что компьютер инфицирован червем? Надо проверить, какие компьютеры чаще других отправляют ARP-пакеты.
Черви/вирусы/шпионские программы нередко пытаются соединиться со случайно выбранным компьютером локальной сети. Когда компьютер впервые пытается связаться с локальным IP-адресом, он отправляет ARP-пакет для выяснения Ethernet (МАС) — адреса. Нормальные (не-инфицированные) компьютеры обычно общаются лишь с несколькими компьютерами: с серверами, которые им нужны, и с их локальным маршрутизатором. Если обнаружится, что какой-то компьютер отправляет значительно больше ARP-пакетов, чем остальные, скорее всего, это можно считать признаком его заражения.
Построим простой канал в оболочке, который будет собирать следующие 100 ARP-пакетов в сети и определять, какой хост сгенерировал больше пакетов, чем другие хосты того же уровня. Что-то вроде