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



              

Двоичные журналы - часть 3


/p>

Шаблоны созданы, теперь используем их в настоящей программе:

шаблон, который мы собираемся передать unpack()

Stemplate = "А8 А8 А16 1";

ft используем pack(), чтобы определить размер (в байтах) каждой записи

Srecordsize = length(pack($template,()));

ft открываем файл

open(WTMP, "/var/adrc/wtmp") or die "Невозможно открыть wtT.D:$! \i":

# считываем его по одной записи

while (read(WTMP,SrecordSrecordsize)) {

# распаковываем, используя шаблон

($tty. $narne. $host $time)=unoack($temolate. Srecorc).

# специальным образом обрабатываем записи

if (Sname and substr($name. 0.1) г.е "\0"){

print "$tty:$name:$nobt : "

scalar localtime($time),"\n"; }

else <

print "$tty:(logout).(logout):",

scalar localtime(Stime),"\n";

i i

}

tt закрываем файл close(WTMP);

Вот как выглядит вывод этой маленькой программы:

":reboot::Мол Nov 17 15:24:30 1997

:0:dnb::0:Mon Nov 17 15:35:08 1997

ttyp8:user:host.mcs.anl.go:Mon Nov 17 18:09:49 1997

ttyp6:dnb:limbO-114.ccs.ne:Mon Nov 17 19:03:44 1997

ttyp6:(logout):(logout):Mon Nov 17 19:26:26 1997

ttyp1:dnb:traal-22.ccs.neu:Mon Nov 17 23:47:18 1997

ttyp1:(logout):(logout):Tue Nov 18 00:39:51 1997

Приведем пару комментариев:

В SunOS завершение работы с терминалов определенного типа отмечается символом с кодом 0 в первой позиции, поэтому:

if ($name and substr($name,1,1) ne "\0")

{

read() принимает в качестве третьего аргумента количество байт, которые нужно прочесть. Вместо того чтобы жестко определить размер записи как «32», мы воспользовались удобным свойством функции pack(). Если этой функции передать пустой список, то она возвращает пустую или заполненную пробелами строку размером, совпадающим с размером записи. Это позволяет передать функции pack() произвольный шаблон и узнать ее размер:

$recordsize = length(pack($template,()));

Вызов внешней программы

Работа с файлами wtmp - настолько распространенная задача, что в Unix есть специальная команда под названием last, предназначенная для вывода двоичных файлов в формате, удобном для человека. Вот образец ее вывода, показывающий примерно те же данные, что и в предыдущем примере:




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