Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#10| Мaneater (part 1)
Demon's Souls |#9| Heart of surprises
Demon's Souls |#8| Maiden Astraea
Demon's Souls |#7| Dirty Colossus

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Сэйдж Рас Весь текст 822.4 Kb

Приемы профессиональной работы в Unix

Предыдущая страница Следующая страница
1 ... 39 40 41 42 43 44 45  46 47 48 49 50 51 52 ... 71

 Время доступа       creat, mknod, pipe, utime, read
 Время модификации   creat, mknod, pipe, utime, write
 Время создания      creat, mknod, pipe, utime, write,
                     chmod, chown, link
---------------------------------------------------------------------------

     Давайте на некоторое время отвлечемся и поговорим о том,  что эти
временные характеристики означают и как они могут быть модифицированы.
Одно  интересное  замечание:  UNIX  дает вам как обычному пользователю
возможность установить любое время доступа и время  модификации  файла
по вашему желанию.  Это и хорошо,  и плохо. Это обеспечивает гибкость,
когда дело касается информации индексного дескриптора файла,  но также
позволяет скрывать следы при нарушении защищенной информации. Возьмем,
например,  файл login. Кто-нибудь мог бы вставить новую строку регист-
рации перед старой и затем вернуть время доступа и время модификации в
исходные значения. Тогда бы никто, просматривая файл /bin/login коман-
дой ls, не смог бы сказать, что файл был изменен.

     Однако в  системе  UNIX  имеется  третье  время - время создания.
Система не позволяет вам изменить это время при помощи обычных команд.
Системный вызов utime(2) обеспечивает изменение только времени доступа
и модификации.  Команда touch(1) также может изменить время доступа  и
модификации,  но  не время создания.  Команда touch строится только на
системном вызове.  Она может делать не больше того,  что  обеспечивает
системный вызов.  Команда fsdb(1) (отладчик файловой системы) является
единственным способом преодоления защиты от изменения  времени  созда-
ния. Но даже fsdb не может управлять временем создания. Вы должны вый-
ти за пределы поддерживаемых fsdb  требований  безопасности.  Как  это
сделать, показано в последующих главах.

     В случае изменения регистрационной записи, рассмотренном выше, вы
могли бы посмотреть на время создания и увидеть,  что оно очень близко
к  текущему  времени.  Если  же кто-либо использовал fsdb для подделки
времени создания,  вы никогда не будете иметь уверенности в  том,  что
файл не был изменен.

     Какое же  все  это  имеет отношение к определению того,  делал ли
пользователь что-либо недавно за своим терминалом?  Время  модификации
изменяется вызовом write(2).  Поэтому представляется разумным, что за-
пись на терминал будет иметь место, когда драйвер читает символ, а за-
тем посылает его обратно на экран.  По мере того,  как кто-то нажимает
на клавиши,  время модификации постоянно обновляется при эхо-отображе-
нии символов. Когда символы перестают поступать с клавиатуры, приоста-
навливается запись в файл терминала. Формула для определения последне-
го времени работы за терминалом (last_activity) такова:

  last_activity = time(NULL) - mod_time,

где mod_time - время модификации.  Эта формула закодирована внутри ко-
манды who(1).  Отметим, что вызов команды time со значением NULL возв-
ращает истинное текущее время.

     Команда activ не имеет опций.  Если вы используете опции, напеча-
тается сообщение об ошибке.

     ПОЯСНЕНИЯ

     В строках 4-8 выполняется проверка на наличие ошибок.  Если число
аргументов командной строки больше нуля, на стандартное устройство ре-
гистрации ошибок выводится сообщение и программа завершается с неудач-
ным статусом.

     Строка 10 - это команда, выполняющая вывод. Команда who вызвана с
опцией -u для получения основных данных.  Затем ее выход по  конвейеру
передается команде cut,  которая отображает колонки 1-17 и 38-42.  Тем
самым печатается только три поля, как показано в нашем предыдущем при-
мере.

---------------------------------------------------------------------------

ИМЯ: info
---------------------------------------------------------------------------

info      Вывод на экран информации о пароле пользователя

     НАЗНАЧЕНИЕ

     Печатает информацию  поля  комментария  из файла /etc/ passwd для
указанного пользователя.

     ФОРМАТ ВЫЗОВА

        info login_name [ login_name ... ]

     ПРИМЕР ВЫЗОВА

        info russ   Печатает информацию, которая хранится
                    о пользователе russ

     ТЕКСТ ПРОГРАММЫ

1   :
2   # @(#) info v1.0  Display password info on a user Author: Russ Sage
2а                    Отобразить парольную информацию пользователя

4   for NAME in $@
5   do
6         USER=`grep "^${NAME}:" /etc/passwd`
7         echo "$NAME:\t`echo ${USER}|cut -d: -f6`\t`
echo ${USER}|cut -d: -f5`"
8   done

     ПЕРЕМЕННЫЕ СРЕДЫ ВЫПОЛНЕНИЯ

NAME      Каждое имя, указанное в командной строке
USER      Полная запись в файле /etc/passwd для данного имени

       ОПИСАНИЕ

                 ЗАЧЕМ НАМ НУЖЕН КОМАНДНЫЙ ФАЙЛ info?

     Система UNIX   использует  конфигурационные  файлы  для  хранения
основной информации о пользователях и другой системной информации. Од-
ними   из   наиболее   популярных   конфигурационных  файлов  являются
/etc/group,  /etc/passwd и /etc/inittab.  Для получения  информации  о
пользователях нам необходимо заглянуть в эти файлы.

     В системе  Berkeley имеется команда finger,  которая получает ин-
формацию о пользователях из их регистрационных каталогов  и  из  файла
паролей. В System V не так много программ, выполняющих такого рода ра-
боту, поэтому нам необходимо разработать их.

                           ЧТО ДЕЛАЕТ info?

     Info - это командный файл, который получает информацию из регист-
рационного каталога и комментарий о пользователе из файла /etc/passwd.
Результат выглядит так:

---------------------------------------------------------------------------

|
|    name:     home dir                   comments
|    имя:      регистрационный каталог    комментарии
|

     Если в вашей системе используется это поле комментариев,  то  эта
информация может быть полезной. "Вручную" выполнить просмотр пользова-
телей в файле паролей можно следующим образом:

grep login_name /etc/passwd

     При этом распечатывается вся строка со всеми полями данных.  Info
берет  эти необработанные данные и выделяет из них каталог регистрации
пользователя и поле комментария.

     В командной строке можно указать несколько регистрационных  имен.
Каждое имя берется по порядку из командной строки.

     ПРИМЕР

$ for NAME in `cat /etc/passwd | cut -d: -f1`
> do
>         NAMELIST="$NAMELIST $NAME"
> done; info $NAMELIST

     Имя каждого  пользователя  в  файле  паролей добавляется к списку
имен.  Затем этот список передается в командную строку  info,  которая
печатает все данные. Смысл команды: "Дай мне информацию обо всех поль-
зователях системы".

     ПОЯСНЕНИЯ

     Строки 4-8 - это цикл for,  который обрабатывает все имена, пере-
данные  в командной строке.  Для каждого переданного имени выполняются
строки 6 и 7.

     В строке 6 в переменную USER заносится  результат  команды  grep,
заключенной  между  символами  ударения  (`).  Начиная с начала строки
(обозначено символом ^), grep ищет имя, за которым следует символ дво-
еточия (:). Такое указание заставляет выполнять поиск образца только в
первом поле файла паролей.

     В строке 7 мы отображаем  нашу  выходную  строку  командой  echo,
внутри которой вложены другие команды echo.  Мы могли бы получать эле-
менты информации отдельно,  присваивая их значения отдельным  перемен-
ным,  и затем создавать необходимый формат вывода,  используя значения
этих переменных.  Однако помещение всей информации в командную  строку
работает быстрее,  и текст программы более компактный, хотя и не очень
читабельный.  Мы можем также использовать символы форматирования в ко-
манде echo для форматирования нашей распечатки.

     Сначала отображается  имя в том же виде,  как оно получено из ко-
мандной строки.  Затем выводится табуляция (\t).  За первой табуляцией
следует  поле номер шесть из файла паролей.  Поскольку мы еще не имеем
этих данных,  мы должны выделить их из значения переменной USER, кото-
рую мы уже имеем из предыдущей строки.  Чтобы сделать это, мы командой
echo выводим всю строку и выделяем шестое поле,  используя разделяющие
двоеточия.  После этого поля мы выводим еще одну табуляцию и затем пя-
тое поле файла паролей.  Мы получили это поле таким же образом,  как и
шестое поле - эхо-отображением и выделением.

     Такая техника получения данных медленная, поскольку вовлечены все
процессы, но это самый быстрый путь сделать это на языке shell. Коман-
да awk была бы понятнее и,  возможно,  быстрее, но наша реализация де-
монстрирует гибкость языка shell.  Язык shell  может  выполнять  почти
все,  но  не всегда лучшим образом.  Вот почему в некоторых случаях мы
используем язык Си,  в чем вы убедитесь по мере продвижения  по  нашей
книге.

---------------------------------------------------------------------------

ИМЯ:  uchk
---------------------------------------------------------------------------

uchk      Проверка процессов, запущенных другим пользователем

     НАЗНАЧЕНИЕ

     Отобразить все  процессы  каждого пользователя,  указанного в ко-
мандной строке

     ФОРМАТ ВЫЗОВА

uchk [-a] login_name [...]

     ПРИМЕР ВЫЗОВА

uchk -a   Вывод всех процессов, запущенных администраторами

     ТЕКСТ ПРОГРАММЫ

1   :
2   # @(#) uchk v1.0  Check processes of another user Author: Russ Sage
2а                    Проверка процессов другого пользователя

4   trap "rm /tmp/ps$$ 2> /dev/null"  0 1 2 3 15

6   if [ $# -eq 0 ]
7     then  echo "uchk: argument error"                >&2
8           echo "usage: uchk [-a] login_name [ ... ]" >&2
9           exit 1
10  fi

12  if [ "`echo $1 | cut -c1`" = "-" -a "$1" != "-a" ]
13    then  echo "uchk: invalid argument $1"            >&2
14          echo "usage: uchk [-a] login_name [ ... ]"  >&2
15          exit 1
16  fi

18  ADMIN="administrators names go here"
19  if [ "$1" = "-a" ]
20    then  shift
21          set $ADMIN $@
22  fi

24  ps -ef > /tmp/ps$$
25  for NAME
26  do
27          echo
28          fgrep "$NAME" /tmp/ps$$
29  done

     ПЕРЕМЕННЫЕ СРЕДЫ ВЫПОЛНЕНИЯ

ADMIN     Строка с именами пользователей, являющихся
          администраторами в вашей системе
NAME      Содержит каждое имя, считываемое из командной строки

       ОПИСАНИЕ

                 ЗАЧЕМ НАМ НУЖЕН КОМАНДНЫЙ ФАЙЛ uchk?

     Поскольку UNIX является многопользовательской системой, множество
задач выполняются одновременно.  Единственный способ следить за такими
задачами - с помощью команды ps. Ps - это довольно специфичная команда
в том смысле,  что она должна обращаться к памяти (/dev/mem) и  прохо-
дить по связанному списку структур процесса. Это тяжелая вещь, поэтому
нелегко сделать свою собственную команду для вывода такого рода инфор-
мации. Вдобавок память защищена, и доступ к ней имеет только пользова-
тель root.

     Так что мы должны или удовлетвориться опциями,  которые дает  ко-
манда ps, или модифицировать вывод этой команды. Uchk скорее относится
к последней категории.  Мне хотелось получить  список  состояний  про-
цессов  по  имени пользователя,  а не смесь информации,  относящейся к
разным пользователям.  Хотя то, что я хотел, не соответствует ни одной
из  стандартных  опций команды ps,  я смог модифицировать ее выход для
получения того, что мне надо.

                           ЧТО ДЕЛАЕТ uchk?

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

     Чтобы делать  это,  uchk  должен  работать  с временными файлами.
Система UNIX весьма элегантно управляет временными файлами. Shell поз-
воляет  использовать  идентификатор  процесса  для создания уникальных
имен файлов для каждого запуска. После того как утилита запущена, вре-
Предыдущая страница Следующая страница
1 ... 39 40 41 42 43 44 45  46 47 48 49 50 51 52 ... 71
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (52)

Реклама