Жанр: Учеба
Приемы профессиональной работы в Unix
...си относятся к сегодняшнему или
завтрашнему дню, эта утилита посылает их вам по почте.
Командный файл office использует несколько иной подход. Сначала
ваш файл календаря проверяется на существование и ненулевой размер.
Если файл существует, то он выводится на экран в длинном формате, так
что вы можете увидеть сам файл и информацию, относящуюся к нему. После
этого выполняется функция calendar. При таком вызове на стандартное
устройство вывода печатаются все записи, подходящие по времени. Утилита
calendar, вызываемая командой cron, обеспечивает связь только при
помощи почты. Если календарного файла нет, то выводится сообщение, информирующее
об этом.
Следующим вариантом выбора являются телефоны. Для управления базой
данных телефонных номеров используется утилита phone, рассмотренная
в предыдущем разделе. Поскольку при вызове phone не выполняется
никакой предварительной или последующей обработки данных, вы можете
перечитать этот раздел, чтобы вспомнить, как работает эта утилита.
Пятый вариант выбора - автоматические напоминания. Эта опция
предназначена для того, чтобы помогать вам в слежении за важными моментами
времени в течение дня. Первым делом она приветствует вас в духе
утилиты greet. Затем запускаются в фоновом режиме два командных
файла at. Они срабатывают в 11:45 для объявления о ленче и в 16:45 для
объявления о конце рабочего дня. Если вы хотите запустить некоторые из
ваших собственных командных файлов в фоновом режиме выполнения, ответьте
"yes" (да) на следующий вопрос. Для напоминания выводится синтаксис
утитлиты at, печатается текущее время, и ожидается ваш ввод команд
для at. Красиво и просто в применении! (Если в вашей системе имеется
встроенная возможность at, а вы реализовали нашу версию at под
другим именем или в другом каталоге, проследите за соответствующими
изменениями в тексте командного файла.)
Благодаря способу выполнения введенной вами команды at, вы можете
ввести любую команду, но не саму at. Цикл сделан так, что он принимает
столько команд, сколько вам нужно. Для выхода из цикла введите возврат
каретки.
Последняя опция предназначена для выполнения любой желаемой команды
вне программы office, оставаясь тем не менее в office. Вы даже
можете бы запустить еще один shell вне программы office (введя с клавиатуры
sh), а затем по control-D вернуться в office. Нет почти ничего
невозможного.
Для выхода из office достаточно просто нажать возврат каретки.
Тем самым произойдет выход из бесконечного цикла и возврат к предыдущему
shell.
ПРИМЕРЫ
$ office
s
sh
$
Запуск office и выбор работы с shell. Затем запуск shell-команды
с именем sh, т.е. самого shell. При этом вы запускаете новый shell и
получаете его символ приглашения. По окончании работы с этим shell
введите ^d для выхода из него и возврата к главному меню утилиты
office.
ПОЯСНЕНИЯ
Строки 4-8 выполняют проверку на ошибки. Если вы вызвали office с
какими-либо опциями, то вы создали ситуацию ошибки.
Строки 10-107 - это один большой цикл while. Его структура подобна
ранее рассмотренным утилитам, управляемым с помощью меню. Строка 12
очищает экран командой c (см. главу 7). Если вы не хотите читать с забеганием
вперед и включать в текст эту команду, вы можете пока пропустить
эту строку или, если у вас система BSD, использовать команду
clear. В строке 13 позиционным параметрам присваивается результат команды
date.
Строки 14-27 выводят само меню, а строка 29 читает вводимую пользователем
команду. Строки 31-106 представляют собой оператор case, который
распознает введенную команду и выполняет соответствующие
действия.
Строка 32 выполняет выход из программы office, если был введен
только возврат каретки. Строки 33-45 управляют командой mail. Вначале
с помощью команды test проверяется, имеет ли файл с почтовыми сообщениями
размер больше нуля. Если да, выводится пустая строка и почтовый
файл печатается в длинном формате команды ls. Затем вам задается вопрос
о том, хотите ли вы просмотреть почту. Еслы вы вводите "y", вызывается
команда mail. При любом другом вводе выполняется возврат в
главное меню.
Строки 46-63 обрабатывают команду новостей. Сначала переменная
PWD устанавливается на наш текущий рабочий каталог. Это делается для
того, чтобы при переходе командой cd в какое-то другое место, мы смогли
по окончании обработки вернуться туда, где мы начали работать. Затем
по команде 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
| имя: регистрационный каталог комментарии
|
Если в вашей системе используется это поле комментариев, то эта
информация может быть полезной. "Вручную" выполнить просмотр пользователей
в файле паролей можно следующим образом:
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 выводим всю строку и выделяем шестое поле, используя разделяющие
двоеточия. После этого поля мы выводим еще одну табуляц
...Поділитися у соцмережах