Perl для системного администрирования



              

Обращайте внимание на подозрительную активность - часть 4


Начинаем мы с того, что обходим в цикле вывод команды last. На нашей системе он выглядит примерно так:

Cindy pts/10 sinai.ccs.neu.ea Fri Mar 27 13:51 still logged in

michael pts/3 regulus. ccs. neu Fn Mar 27 13:51 still logged I"'

david pts/5 fruity-pebbles.с Fri Mar 27 13:48 still logged in

deborah pts/5 grape-nuts.ccs.n Fri Mar 27 11:43 - 11:53 (00:09)

barbara pts/3 152,148.23,66 Fri Mar 27 10:48 - 13:20 (02:31)

Jerry pts/3 nat16. asoer-tec с Fri Mar 27 09:24 - 09:26 (00:01)

Заметьте, что имена узлов (в 3-й колонке) в выводе команды last усечены. В главе 9 мы уже говорили об ограничениях на длину имени узла, но до сих пор мы обходили стороной это препятствие. Когда мы попробуем заполнить нашу структуру данных, проблемы станут очевидными.

Раньше в цикле while мы пытались пропустить строчки, содержащие данные, которые нас не интересуют. Как правило, проверка особых случаев в самом начале цикла до какой-либо обработки данных (на-

пример, при помощи spnt()) - неплохая идея. Это позволяет программе быстро определить, что можно пропустить определенную строчку и перейти к дальнейшему чтению данных:

while (<LAST>){

 игнорируем специальных погьзонателей

next if /~rePoot\s]"shutdown\s|~flp\s/:

 если использовался ключ -и д/'.я определения конкретного

 пользователя, пропускаем все записи, не относящиеся к

 нему (имя сохраняется в $opt_u функцией getopts)

next if (defined $opt_u && !/"$opt_u\s/);

 игнорируем вход с консоли X

next if /:0\s+:0/;

# ищем имя пользователя, терминал и имя удаленного узла

($user, $tty,$host) = split;

 игнорируем, если запись в журнале имеет "плохое" имя

 пользователя

next if (length($user) < 2);

 игнорируем, если для данного имени нет информации о домене

next if $host !" Д./;

 ищем доменное имя узла (см. приведенное ниже объяснение)

$dn = &domain($host);

 игнорируем, если доменное имя фиктивное

next if (length ($dn) < 2);




Содержание  Назад  Вперед