Пожалуйста, пользуйтесь этим кодом, если вам понадобится преобразовать простой сценарий в сценарий, обрабатывающий параметры и флаги:
>#!/bin/bash
>MINITEMS=1
>function usage
>{
>echo "
>Usage: $0 [-d] [-a author] [-c file.txt] [-h] dir1 [dir1…]
>-d debug, don't actual run command
>-a author name of the author
>-c copyright override default copyright file
>-h this help message
>"
>exit 1
>}
># Задание умолчаний:
>DEBUG=false
>DEBUGCMD=
>AUTHOR=
>COPYRIGHT=copyright.txt
># Обработка аргументов командной строки
># с возможным переопределением умолчаний
>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 файл | toupper | sort
Тем, кто не знаком с UNIX/Linux, сообщу, что cat — это команда, выводящая файл. Программу toupper я написал для преобразования текста в верхний регистр, a sort — программа, сортирующая строки текста. Все они прекрасно стыкуются.
Теперь напишем более сложную утилиту. Это будет программа, определяющая, какой компьютер в вашей локальной сети наиболее вероятно заражен червем. Программа будет представлять собой один длинный канал.
Звучит неожиданно? Все, что будет делать наша программа, — это искать подозрительные на заражение компьютеры. Иными словами, она выведет список хостов, нуждающихся в более внимательном осмотре. Тем не менее, ваши коллеги будут удивлены, уверяю вас.
Программа не заменит вам хорошее антивирусное обеспечение, но я выбрал этот пример как хорошую иллюстрацию некоторых рудиментарных приемов программирования оболочки. Кроме того, вы узнаете кое-что новое о работе сетей. Когда мы закончим, в ваших руках будет простой инструмент, которым вы сможете пользоваться для диагностики этой конкретной проблемы в своей сети. С помощью этой программы мне удалось убедить руководство в необходимости купить настоящее антивирусное программное обеспечение.
Каков признак того, что компьютер инфицирован червем? Надо проверить, какие компьютеры чаще других отправляют ARP-пакеты.
Черви/вирусы/шпионские программы нередко пытаются соединиться со случайно выбранным компьютером локальной сети. Когда компьютер впервые пытается связаться с локальным IP-адресом, он отправляет ARP-пакет для выяснения Ethernet (МАС) — адреса. Нормальные (не-инфицированные) компьютеры обычно общаются лишь с несколькими компьютерами: с серверами, которые им нужны, и с их локальным маршрутизатором. Если обнаружится, что какой-то компьютер отправляет значительно больше ARP-пакетов, чем остальные, скорее всего, это можно считать признаком его заражения.