Хватит работать сверхурочно, пора работать рационально для системных администраторов



бет17/20
Дата25.07.2016
өлшемі2.53 Mb.
#220661
1   ...   12   13   14   15   16   17   18   19   20
$ makeimagel cdrom/ то последовательность $* будет заменена на cdrom/. Поскольку $* работает и с несколькими аргументами, вы можете ввести: I makeimagel cdrom/ dlrl/ dlr2/

В этом случае вместо $* будут подставлены все три аргумента. Команда mkisofs сольет (merge) все три каталога на CD-ROM. Если вы хотите

указать конкретные элементы командной строки, пишите $1, $2 и т. д. В нашем примере $1 будет соответствовать cdrom/, а $2 - dirl/.

Еще одной причиной, не позволявшей мне писать хорошие сценарии, было мое неумение обрабатывать флаги командной строки, например scriptname -q f ilel. txt. Если сценарий, который требовалось написать, был настолько сложен, что требовал учета флагов командной строки, я использовал другой язык или вообще отказывался от создания сце­нария. Оказывается, в bash есть функция getopt, которая выполняет синтаксический разбор. Однако руководство по bash написано не со­всем понятно. В нем сказано, как работает getopt, но не объясняется, как пользоваться этой функцией. Наконец, я нашел подходящий при­мер и с тех пор периодически копирую его. Неважно, как он работает. Чтобы воспользоваться им, вам совсем необязательно понимать, что он делает и почему. А выглядит он так:

args='getopt ab; $»' if [ $? 1= 0 ] then

echo "Usage: command [-a] [-b file.txt] filel file2 ..." exit -l

fi

set -- $args for i do

case "$i" in

-a)

FLAGA=1 Shift

-b)

ITEMB="$2" ; shift shift

--)

shift; break

esac

done

Предполагается, что есть некая команда с флагами -а и -b. Второй флаг особый, потому что за ним должен следовать аргумент, например -b file. txt. Из первой строчки понятно, что за командой getopt следуют буквы, которые могут быть флагами. После флага, которому требуется дополнительный аргумент, стоит двоеточие. Далее мы видим оператор case (выбор) для каждого возможного аргумента. Код оператора либо ус­танавливает флаг, либо устанавливает флаг и сохраняет аргумент.

А что такое $2? И какой смысл в --)? И что делает set? И как поживает Наоми? Все это вы сможете узнать потом. А сейчас воспользуйтесь об­разцом, и он будет работать.

(Ну ладно. Если вы вправду хотите в этом разобраться, прочитайте «Advanced Bash-Scripting Guide» (Расширенное руководство по напи­санию скриптов bash) по адресу http://www.tldp.org/LDP/abs/ html.)

Теперь я приведу более развернутый пример, иллюстрирующий неко­торые дополнительные возможности. Во-первых, в нем определяется функция usage, предназначенная для вывода справочной информации. Интересная особенность этой функции - команда echo, растянутая на несколько строк. Неплохо, не так ли? bash не возражает. Во-вторых, в этом сценарии проверяется наличие минимального количества (MI- NITEMS) элементов командной строки после обработки аргументов. Наконец, сценарий демонстрирует обработку флагов, переопределяю­щих умолчания.

Пожалуйста, пользуйтесь этим кодом, если вам понадобится преобра­зовать простой сценарий в сценарий, обрабатывающий параметры и флаги:

Я!/bin/bash

MINIT6MS=1

function usage 1

echo "

Usage: $0 [-d] [-a author] [-e file.txt] [-h] dirl [dirl ...]

-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

}

I Задание умолчаний: DEBUG=false DE8UGCMD= AUTH0R=

COPVRIGHT=copyright.txt

» Обработка аргументов командной строки # С возможным переопределением умолчаний

args='getopt da:c:h $•'

if [ t? != О ]

then

usage

fi

set -- $args

for i do

case "$i" in

-h)

usage shift

-a)

AUTH0R="$2"; shift shift



-c)

C0PYRIGHT="$2"; shift shift

-d)

DEBUG=true shift



shift; break;;

esac


done

if $DEBUG ; then

echo DEBUG MODE ENABLED. DEBUGCMD=echo

fi

tt Проверка наличия минимального количества элементов tt командной строки

if SDEBUG ; then echo ITEM COUNT = $# ; fi

if [ $» -It "$MINITEMS" ]; then usage

fi

tt Если первый аргумент особый, запомнить его: # THEITEM="$1" ; shift

tt Клонируйте эту строчку для каждого элемента, tt который хотите сохранить. tt Не забудьте при этом откорректировать значение tt переменной MINITEMS.

tt Если вы хотите обработать остальные элемента,

tt делайте это здесь:

fffor i in $♦ ; do



tt echo Looky! Looky! I got $i

«done


if [ ! -z "SCOPVfllGHT" ]; then

if JDEBUG ; then echo Setting copyright to: {COPYRIGHT ; fi CRfLAG="-copyright {COPYRIGHT"

fi

LABEL=*date -u +%Y%m«d'

$DE8UGCMD mkisofs -D -1 -J -r -L -f -P "$AUTHOH" -V $LA8EL $CRFLAG £•

Построение длинной командной строки



Самый лучший способ научиться сцеплять команды UNIX/Linux в один длинный канал - заглядывать через плечо того, кто этим занимается. Сейчас я попробую научить вас делать это, создав на ваших глазах не­большую утилиту.

Книга «Hiink UNIX» (Думайте в духе UNIX), Que, - отличный учебник по объединению инструментов UNIX/Linux в длинные команды.

Самой мощной технологией, представленной в UNIX/Linux, является возможность объединить несколько команд аналогично тому, как на­ращивают садовый шланг для поливки. Если у вас есть программа, ко­торая преобразует входной текст в верхний регистр, и программа, сор­тирующая строки в файле, то вы можете сцепить их друг с другом. В ре­зультате вы получите команду для преобразования строк в верхний ре­гистр и их вывода в заданном порядке. Все, что от вас требуется, - это поставить символ «|» между командами. Выходная информация одной команды поступит на вход следующей:

$ cat файл | toupper ) sort

Тем, кто не знаком с UNIX/Linux, сообщу, что cat - это команда, вы­водящая файл. Программу toupper я написал для преобразования тек­ста в верхний регистр, a sort - программа, сортирующая строки тек­ста. Все они прекрасно стыкуются.

Теперь напишем более сложную утилиту. Это будет программа, опре­деляющая, какой компьютер в вашей локальной сети наиболее веро­ятно заражен червем. Программа будет представлять собой один длин­ный канал.

Звучит неожиданно? Все, что будет делать наша программа, - это ис­кать подозрительные на заражение компьютеры. Иными словами, она выведет список хостов, нуждающихся в более внимательном осмотре. Тем не менее, ваши коллеги будут удивлены, уверяю вас.



Программа не заменит вам хорошее антивирусное обеспечение, но я вы­брал этот пример как хорошую иллюстрацию некоторых рудиментар­ных приемов программирования оболочки. Кроме того, вы узнаете кое-

что новое о работе сетей. Когда мы закончим, в ваших руках будет про­стой инструмент, которым вы сможете пользоваться для диагностики этой конкретной проблемы в своей сети. С помощью этой программы мне удалось убедить руководство в необходимости купить настоящее антивирусное программное обеспечение.

Каков признак того, что компьютер инфицирован червем? Надо прове­рить, какие компьютеры чаще других отправляют ARP-пакеты.

Черви/вирусы/шпионские программы нередко пытаются соединиться со случайно выбранным компьютером локальной сети. Когда компью­тер впервые пытается связаться с локальным IP-адресом, он отправля­ет ARP-пакет для выяснения Ethernet (МАС)-адреса. Нормальные (не- инфицированные) компьютеры обычно общаются лишь с нескольки­ми компьютерами: с серверами, которые им нужны, и с их локальным маршрутизатором. Если обнаружится, что какой-то компьютер от­правляет значительно больше ARP-пакетов, чем остальные, скорее всего, это можно считать признаком его заражения.

Построим простой канал в оболочке, который будет собирать следую­щие 100 ARP-пакетов в сети и определять, какой хост сгенерировал больше пакетов, чем другие хосты того же уровня. Что-то вроде кон­курса «Кто пошлет больше пакетов». В прошлую такую проверку я об­наружил, что червями заражены два из пятидесяти компьютеров сети.

Команды, приведенные ниже, должны работать в любой системе UNIX/Linux или другой UNIX-подобной системе. Вам понадобится ко­манда tcpdump и доступ с правами root. Команда which tcpdump сообщит вам, установлена ли команда tcpdump в вашей системе. Проверка па­кетов в сети имеет этические аспекты. Выполняйте ее, только если у вас есть разрешение.

Вот команда, получившаяся у меня в итоге (прошу прощения за ис­порченный сюрприз):

$ sudo tcpdump -1 -n агр | grep 'arp who-has' [ \ head -100 | awk '{ print INF }' |sort | unlq | sort -n



Она такая длинная, что не помещается в одной строке этой книги, по­этому я разбил ее на две строки, а символом переноса служит обрат­ный слэш. Вам не нужно набирать обратный слэш при вводе коман- ды.1 Не следует и нажимать клавишу Enter в этом месте.

Вывод команды выглядит так:

tcpdump; verbose output suppressed, use -v or -vv for full protocol decode listening on enQ, link-type EN10MB (Ethernet), capture size 96 bytes

  1. 192.168.1.104

  2. 192.168.1.231 5 192.168.1.251 7 192.168,1.11 7 192.168.1.148

    1. 192.168.1,230

    2. 192.168.1.254 11 192.168.1.56 21 192.168.1.91 30 192.168.1.111

101 packets captured

3079 packets received by

Достарыңызбен бөлісу:
1   ...   12   13   14   15   16   17   18   19   20




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет