Рассел Сейдж. Приемы профессиональной работы в unix перевод "Tricks of the unix masters" by Russel G

Вид материалаДокументы

Содержание


Осведомленность пользователя
Защита личной информации
Управление личной информацией ii
Осведомленность пользователя
Формат вызова
Формат вызова
Переменные среды выполнения
Подобный материал:
1   ...   21   22   23   24   25   26   27   28   ...   45

тем по команде cd мы переходим в каталог /usr/news. Это каталог, в ко-

тором хранятся файлы новостей. В системе Berkeley доступен каталог

/usr/msgs. Этот каталог очень похож на /usr/news и может использо-

ваться вместо него, если у вас есть такое желание. Выводится в виде

столбцов список файлов из каталога /usr/news (строка 49), и вам зада-

ется вопрос о том, хотите ли вы посмотреть какие-нибудь из этих фай-

лов. Если вы вводите возврат каретки, команда test воспринимает это

как нулевой ввод и выполняется выход из оператора while.

Цикл while выполняется до тех пор, пока значение переменной NAME

не равно нулю (строка 52). Введенное имя проверяется на существование.

Если такой файл существует, то он распечатывается командой cat, обрам-

ленной строками из черточек. Если файл не существует, то выводится

сообщение о том, что такого файла новостей нет. Затем вас просят

ввести имя другого файла. Этот процесс продолжается в цикле, пока вы

не введете только возврат каретки. Когда вы выходите из цикла в строке

62, выполняется команда cd для возврата в тот каталог, откуда вы нача-

ли работать. Эта команда cd не оказывает никакого влияния после за-

пуска утилиты office. Вы должны указать команду cd вашему регистраци-

онному shell. Никакая другая программа, запущенная из порожденного

shell, не может выполнить для вас команду cd.

Строки 64-77 выполняют функции календаря. Сначала выводятся две

пустые строки. Почему две? Потому что обычно команда echo вставляет

символ новой строки в конце каждой выводимой строки, а выводимой в

данный момент строкой является еще один символ новой строки. Затем в

строке 65 запускается программа today. Она печатает изображение кален-

даря на месяц. Строка 66 проверяет, имеется ли календарный файл в ва-

шем регистрационном каталоге. Если да, он выводится в длинном формате

команды ls в строке 67. Печатается также сообщение-заголовок "Calendar

Notifications" (календарные извещения).

Строка 69 запоминает текущий рабочий каталог переменной PWD. За-

тем мы переходим командой cd в каталог $HOME, чтобы находиться в том

же каталоге, что и календарный файл. В строке 71 вызывается команда

UNIX calendar. Она просматривает календарный файл и выводит все подхо-

дящие по времени сообщения. По команде cd мы возвращаемся в наш исход-

ный каталог для того, чтобы восстановить порядок. Строка 73 выводит

сообщение, чтобы вы проверили вашу почту на наличие календарных за-

писей. Как указывалось ранее, команда calendar работает двумя способа-

ми.

Оператор else в строке 74 выводит вам сообщение, если у вас нет

календарного файла. По завершении оператора if, в строках 76 и 77 пе-

чатается сообщение о том, что нужно нажать возврат каретки, и выполня-

ется оператор read. Это блокирующее чтение, которое означает остановку

и ожидание какого-либо ввода. Это противоположность неблокирующему

чтению, или более широко известной технике чтения с опросом. Опрос

возможен в программах, написанных на Си, но запуск опроса в shell мо-

жет потребовать немного больших усилий. Для изучения чтения с опросом

ознакомьтесь с главой, описывающей терминальные устройства.

Строка 78 управляет командой phone. Она вызывает утилиту phone,

которую мы рассмотрели ранее, после чего управление передается в конец

цикла while. Печатается главное меню, и все начинается сначала.

Строки 79-97 управляют автоматическими напоминаниями. Сначала за-

пускается программа greet. Она была описана ранее в этой главе. Затем

в строках 80 и 81 в режиме фонового выполнения вызываются два команд-

ных файла at, которые выполнятся позже в течение дня. В строке 84 вам

задается вопрос, желаете ли вы оставить какие-то свои напоминания.

Если вы отвечаете "y", выполняются строки 87-96. Если вы не ввели "y",

оператор else не выполняется, поэтому управление передается главному

меню. Вы видите, что эта возможность предполагает однократное исполь-

зование в течение дня.

Строки 87-89 выводят некоторую информацию, необходимую для того,

чтобы вы завели для себя напоминания. Выводится синтаксис программы

at, текущая дата (только время) и затем приглашение вводить вашу ко-

манду. Строка 90 читает вашу команду. Строка 91 означает, что если был

введен не только возврат каретки, то нужно выполнить этот цикл. Поэто-

му цикл while продолжается, пока вы не нажмете только возврат каретки.

Строка 93 пытается выполнить команду, которую вы ввели. Команда eval

используется для того, чтобы раскрыть значения тех переменных, которые

могли быть не раскрыты ранее. Строка 94 просит ввести следующую коман-

ду, а строка 95 читает ее. Поскольку чтение стоит в самом конце цикла,

оператор while выполняет проверку нового ввода с клавиатуры.

Строки 98-102 управляют выходом в shell. Эта часть программы поч-

ти идентична циклу, использованному для напоминаний. Нам выдается

приглашение на ввод команды, она зачитывается в переменную, затем де-

лается синтаксический разбор этой переменной с помощью команды eval.

Если вы хотите перейти в shell, выполните команду sh - и она породит

shell. Строки 101 и 102 не дают появиться на экране главному меню до

тех пор, пока вы не нажмете возврат каретки.

Строки 103-105 выполняют проверку на ошибки ввода. Любая непра-

вильная команда попадает сюда. Выводится сообщение об ошибке и выда-

ется приглашение "hit " (нажмите возврат каретки).


* ГЛАВА 6. УПРАВЛЕНИЕ ЛИЧНОЙ ИНФОРМАЦИЕЙ II: *


ОСВЕДОМЛЕННОСТЬ ПОЛЬЗОВАТЕЛЯ


И ЗАЩИТА ЛИЧНОЙ ИНФОРМАЦИИ


ОСВЕДОМЛЕННОСТЬ ПОЛЬЗОВАТЕЛЯ


activ показать активность терминалов

info показать информацию о паролях пользователей

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

watch наблюдать за регистрацией в системе

whox команда who с дополнительными возможностями


ЗАЩИТА ЛИЧНОЙ ИНФОРМАЦИИ


acme показать учетную информацию

inuse запретить использование терминала

lock блокировать и разблокировать файлы


УПРАВЛЕНИЕ ЛИЧНОЙ ИНФОРМАЦИЕЙ II:

ОСВЕДОМЛЕННОСТЬ ПОЛЬЗОВАТЕЛЯ


И ЗАЩИТА ЛИЧНОЙ ИНФОРМАЦИИ


ВВЕДЕНИЕ


Мы уже разработали целый ряд инструментальных средств, которые

помогают нам более эффективно управлять нашей личной информацией. Од-

нако мы работаем не в вакууме. Каждый из нас работает с другими людьми

и обычно использует систему вместе с другими пользователями. По

нескольким причинам важно иметь представление о том, что делают в

системе другие люди. Во-первых, у нас может возникнуть необходимость

наметить работу, интенсивно использующую процессор, на то время, когда

загрузка системы невелика. Изучение типичных вариантов загрузки систе-

мы может помочь нам спланировать такую работу и сотрудничать с другими

пользователями со взаимной выгодой.


Нам также может понадобиться знать, находится ли кто-то на своем

рабочем месте, чтобы мы могли поговорить с ним, или знать, что кто-то

очень занят и был бы недоволен, если его прервут.


Наконец, существуют вопросы защиты информации, которым мы уделим

больше внимания в последующих главах. Основой защиты информации явля-

ется осведомленность о том, что делают другие - и, возможно, о том,

что они не должны делать.


Поэтому мы здесь представим две группы инструментальных средств.

Средства ОСВЕДОМЛЕННОСТИ ПОЛЬЗОВАТЕЛЯ помогают нам следить за тем, что

делают другие, и тем самым упростить связь с ними. Средства ЛИЧНОЙ ЗА-

ЩИТЫ важны для защиты нашей учетной информации и наших данных и для

получения информации о наших собственных действиях.


Первая группа рассматриваемых здесь средств, относится к "осве-

домленности пользователя". Этими средствами являются activ, info,

uchk, watch и whox.


Командный файл activ представляет собой модификацию команды who,

показывающую имя каждого пользователя, номер терминала и сведения о

том, насколько давно данное лицо вводило что= либо с клавиатуры. По

этой информации мы можем сказать, кто еще работает в системе, активно

ли они работают и, если они используют закрепленные линии, то где они

находятся.


Следующее средство - info. Оно предоставляет возможность получить

информацию о паролях всех указанных в списке пользователей. С помощью

этой утилиты вы можете получить общую информацию об этих пользователях

и увидеть, где размещаются их регистрационные каталоги.


Еще одно информативное средство - uchk. Этот командный файл поле-

зен для выяснения того, что делает указанный пользователь в настоящее

время. По этой информации вы можете сказать, простаивают ли они или же

делают что-то важное и их нельзя прерывать.


Следующее средство - watch. Эта программа похожа на "демон", ко-

торый выполняется в фоновом режиме и постоянно следит за регистрацией

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

ваш терминал посылается сообщение о том, что данный пользователь вошел

в систему. Таким образом, вы можете продолжать работу вместо того,

чтобы постоянно прерывать ее.


Последняя утилита в данном разделе - это whox. Whox дает вам

исчерпывающие сведения обо всех пользователях, зарегистрировавшихся на

машине. Вы можете получить информацию, похожую на результат команды

who, которая отсортирована различным образом, отобразить информацию о

терминалах или даже передать почтовое сообщение любому пользователю.


ОСВЕДОМЛЕННОСТЬ ПОЛЬЗОВАТЕЛЯ


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


ИМЯ: activ

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


activ Показывает активность терминалов


НАЗНАЧЕНИЕ


Показывает имена всех зарегистрированных пользователей, номера их

терминалов и время, когда они последний раз работали с клавиатурой.


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


activ


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


activ Выводит на экран информацию об активности

пользователей на своих терминалах


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


1 :

2 # @(#) activ v1.0 Display terminal activity Author: Russ Sage

2а Показать активность терминалов


4 if [ $# -gt 0 ]

5 then echo "activ: argument error" >&2

6 echo "usage: activ" >&2

7 exit 1

8 fi


10 who -u | cut -c1-17,38-42


ОПИСАНИЕ


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


Первоначально компьютеры использовались исключительно для запуска

замкнутых, независимых задач обработки информации. Появление много-

пользовательских систем сделало возможным по крайней мере элементарное

общение пользователей между собой. Такое общение в настоящее время яв-

ляется аспектом возрастающей важности при работе с компьютером.


Система UNIX предоставляет команды mail и write для пакетного и

интерактивного диалога соответственно. С помощью телефона мы не можем

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

не поговорим, возможно, с одним или несколькими другими людьми.

Поскольку система UNIX постоянно записывает информацию о деятельности

пользователей, было бы полезным уметь использовать эту информацию,

чтобы узнать, кто доступен для общения, и получить общее представление

о том, чем они занимаются. После этого мы можем решать, как и когда мы

хотим связаться с ними.


Activ может рассказать нам о том, сколько времени прошло с тех

пор, когда кто-либо нажимал клавиши на своей клавиатуре. Если в вашей

машине есть выделенные линии, то вы также можете узнать, находится ли

данное лицо на своем рабочем месте.


ЧТО ДЕЛАЕТ activ?


Activ печатает информацию об активности всех пользователей систе-

мы. Распечатка содержит имя пользователя, номер терминала, на котором

он зарегистрировался, и время последнего обращения к клавиатуре. Если

клавиатура была использована в течение последней минуты, этот терминал

отмечается точкой. Если терминал не был использован в течение послед-

них 24 часов, напротив него печатается слово "old". Во всех остальных

случаях выводится время последнего использования терминала в минутах и

секундах. Вот пример такой распечатки:


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


|

| root tty01 01:23

| sage tty05 .

| batch tty12 old

| nuucp tty16 .

|


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

работает с клавиатурой? Поскольку терминальные устройства являются

файлами, мы можем собрать информацию о терминале путем просмотра

состояния файла, связанного с ним. В данном случае искомая информация

- время последнего использования клавиатуры.


То, что мы ищем, уже есть в системе. Это опция -u команды who.

Эта опция, однако, существует только в системе AT&T UNIX System V, по-

этому команда activ, по крайней мере в представленном виде, может быть

реализована только в этой системе. Activ берет выход команды "who -u"

и "отрезает" некоторые данные, не имеющие отношения к нашей цели.


Путем проб и ошибок, а затем проверки исходного кода я обнаружил,

что значение, используемое в команде "who -u", является временем "мо-

дификации" файла устройства, которое сообщает системный вызов stat(2).

На страницах руководства по stat дается полная таблица системных вызо-

вов, которые изменяют временные характеристики файлов. В табл. 6.1

представлены эти характеристики:


Таблица 6.1

Временные характеристики файла


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


Временные Системные вызовы, изменяющие временные

характеристики характеристики

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


Время доступа 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

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

|


Если в вашей системе используется это поле комментариев, то эта