) и основывать поиск на этом числе, а не на числе, введенном пользователем. Вы также могли бы использовать каждую цифру случайного числа для управления выбором слова из различных баз с жаргонными терминами, имея, возможно, по одному файлу для каждой из трех позиций слова и организуя цикл на случайное значение для чтения каждого слова. Слова могли бы читаться и удаляться из файла до тех пор, пока не прочитается слово, которое соответствует случайной цифре. Имеется множество других возможностей. Если вы вовремя не останови- тесь, то обнаружите, что вы написали компьютерную игру! -------------------------------------------------------- ИМЯ: phone -------------------------------------------------------- phone База данных с телефонными номерами НАЗНАЧЕНИЕ Управляемое меню средство, поддерживающее базу данных с телефон- ными номерами ФОРМАТ ВЫЗОВА phone ПРИМЕР ВЫЗОВА phone Вызов телефонной базы данных s Ввод опции поиска russ Поиск номера телефона Расса ТЕКСТ ПРОГРАММЫ phone 1 : 2 # @(#) phone v1.0 Maintain telephone database Author: Russ Sage 2а Сопровождение телефонной базы данных 4 if [ $# -gt 0 ] 5 then echo "phone: argument error" >&2 6 echo "usage: phone" >&2 7 exit 1 8 fi 10 BASE="$HOME/.phone.list" 12 while : 13 do 14 echo " 16 phonebase = $BASE 18 PHONE MENU 19 ---------- 20 add name to list 21 delete name from list 22 edit list 23 search for name in list 24 view complete list 25 - exit program 27 Press a,d,e,s,v or : \c" 28 read RSP 30 case $RSP in 31 "") exit 0 32 ;; 33 a|A) echo "\nEnter name to add ( to exit ): \c" 34 read NAME 35 if [ "$NAME" = "" ] 36 then continue 37 fi 38 echo "Enter description of person: \c" 39 read DESC 40 echo "Enter number to add: \c" 41 read NUM 42 echo "$NAME\t$DESC\t\t\t$NUM" >> $BASE 43 sort -t" " +1 -1.3b -o $BASE $BASE 44 ;; 45 d|D) echo "\nEnter name to delete ( to exit ): \c" 46 read NAME 47 if [ "$NAME" = "" ] 48 then continue 49 fi 50 sed -e "/$NAME/d" $BASE.new 51 mv $BASE.new $BASE 52 ;; 53 e|E) vi $BASE 54 ;; 55 s|S) echo "\nEnter name to search: \c" 56 read NAME 57 echo "\n----------------------------------" 58 grep -y "$NAME" $BASE 59 echo "------------------------------------" 60 ;; 61 v|V) echo "\n\tPhone List\n\t---------" & 62 more $BASE 63 echo "\nhit \c" 64 read RSP 65 ;; 66 *) echo "Not a valid command" 67 ;; 68 esac 69 done ПЕРЕМЕННЫЕ СРЕДЫ ВЫПОЛНЕНИЯ BASE Фактическое имя файла телефонной базы данных DESC Описание, вводимое в базу данных NAME Имя, вводимое в базу данных NUM Номер телефона, вводимый в базу данных RSP Ответ пользователя на приглашение ОПИСАНИЕ ЗАЧЕМ НАМ НУЖЕН phone? Телефоны представляют собой очень важную часть нашего рабочего дня. Мы используем их для сообщения своих планов, отдачи распоряжений и для многих других целей. Немного поразмышляем. Если почти на каждом рабочем месте в США установлен телефон, то телефонных номеров миллио- ны. Каким образом вы храните все ваши телефонные номера? Нам необходима очередная база данных. Эта база данных должна уп- равлять вводом данных, их извлечением, модификацией и удалением. У нас теперь есть опыт в реализации программ, управляемых с помощью меню, поэтому имеет смысл использовать меню и здесь. ЧТО ДЕЛАЕТ phone? Phone - это универсальная утилита для использования и управления базой данных телефонных номеров. Полностью управляемая при помощи ме- ню, phone содержит все необходимые функции, связанные с управлением базой данных: добавление, удаление, просмотр, редактирование и поиск. Файл, представляющий собой базу данных, размещен в вашем регист- рационном каталоге. Это файл $HOME/.phone.list. Phone использует ваш регистрационный каталог, так что один и тот же исполняемый модуль ра- ботает для любого пользователя. Независимо от того, где размещается командный файл phone или кто и откуда его запустил в вашей системе, вы всегда получите именно ваш файл телефонных номеров, поскольку он подк- лючен к вашему регистрационному каталогу посредством встроенной пере- менной shell с именем HOME. Имеется всего одно главное меню. Оно выводится на экран, и внизу появляется приглашение. Большинство вариантов выбора запрашивают до- полнительную информацию. Меню выглядит так: ------------------------ | | | phonebase = /usr/russ/.phone.list | | PHONE MENU | ---------- | add name to list (добавить имя к списку) | delete name from list (удалить имя из списка) | edit list (редактировать список) | search for name in list (поиск имени в списке) | view complete list (просмотр списка) | - exit program (выход из программы) | | Press a,d,e,s,v or : | В верхней строке меню выводится имя телефонной базы данных, кото- рую вы используете. Если это не ваш файл, вы точно знаете, что прои- зошла ошибка. Опции выбираются нажатием клавиши, соответствующей пер- вой букве слова. Если был нажат только возврат каретки, программа за- вершается. ПРИМЕРЫ 1. $ phone a russ sage unix master 123-4567 Такая последовательность действий используется для добавления еще одного номера в базу данных. Вызывайте меню, выбирайте опцию добавле- ния и в ответ на запросы утилиты phone вводите имя, описание и номер телефона. 2. $ phone V Просмотр всех записей в вашей базе данных. ПОЯСНЕНИЯ Строки 4-8 выполняют некоторую проверку на наличие ошибок. Если вы вызвали phone с какими-либо аргументами, выводится сообщение об ошибке и программа завершается. Поскольку phone управляется при помощи меню, она не использует аргументы. Строка 10 инициализирует переменную BASE именем файла телефонной базы данных. Это назначение выполняется с помощью переменной HOME для получения вашего регистрационного каталога. Строки 12-69 представляют собой один большой бесконечный цикл while. Вся эта структура подобна структуре других программ, управляе- мых с помощью меню, которые мы рассмотрели. Само меню выводится опера- тором echo. Текст меню НЕ выделен отступами подобно остальной части программы, поскольку оператор echo воспринимает этот текст как лите- ральные данные, включая пробелы. Строка 28 читает ответ пользователя, а строки 30-68 представляют собой оператор case, который проверяет значение ответа. Если был нуле- вой ввод, программа завершается. Если была введена буква a, выбирается опция добавления. (В действительности каждая опция проверяется и на верхнем, и на нижнем регистре для обеспечения гибкости). Текст программы, соответствующий добавлению, запрашивает имя, описание и номер телефона. Если вы оказа- лись в опции добавления случайно, используйте возможность возврата пу- тем нажатия возврата каретки в ответ на запрос имени. Однако после то- го, как вы ввели имя, выйти уже нельзя. Вам необходимо в этом случае поместить в базу фиктивную запись или нажать клавишу аварийного завер- шения для выхода из программы вообще. Описание может быть произвольной длины, однако оно не смотрится, если очень длинное. После того как все поля введены, вся строка помещается в конец базы данных. Отметим, что добавляются символы табуляции для разбиения записи на поля. После это- го база данных пересортировывается, чтобы новая запись заняла свое место в алфавитном порядке. Если была введена буква d, то она распознается в строке 45. Зап- рашивается удаляемое имя. Если вводится только возврат каретки, опера- тор continue возвращает нас обратно в цикл while и снова выводится главное меню. Для удаления записи использована команда sed, поэтому вводимое имя должно указываться точно в таком же виде, как оно хра- нится в файле. Результат удаления помещается во временный файл, кото- рый затем в строке 51 переименовывается в исходный файл базы данных. Одной из модификаций может быть показ пользователю того, что он соби- рается удалять, и запрос подтверждения. Если подтверждение получено, то данные удаляются окончательно. Сейчас сделано так, что вы на самом деле не знаете, что именно собираетесь удалять. Поэтому необходимо точно указывать удаляемое имя. Здесь выбран относительно быстрый и не совсем честный подход. А вообще вы даже могли бы использовать не- посредственно редактор vi для поиска и удаления. Опция редактирования в строке 53 выполняет только одно - вызывает редактор vi для работы с базой телефонных номеров. Используя редактор vi, вы можете вручную сделать файл базы данных таким, как вам нужно. Зачастую формат входных данных "плывет" из-за разной длины. Все данные хранятся в свободном формате и поэтому их можно как угодно смещать вдоль строки. Когда вы редактируете ваш файл редактором vi, все его команды ак- тивны. Действует даже выход в shell и выполнение обычных действий с системой. Поэтому не забудьте прекратить работу этого shell'а, иначе вы будете весьма удивлены в конце рабочего дня при выходе из системы. Для выхода из редактора и возврата к утилите phone используйте обычные методы, такие как ZZ, :x и :wq. Опция поиска в строке 55 запрашивает имя, которое нужно искать, читает это имя, выводит декоративные элементы до и после данных и использует утилиту grep для нахождения требуемой записи. Утилита grep в строке 58 использует команду -y, вызывающую нечувствительность к ре- гистру. Это означает, что вы можете производить ввод искомого элемента как на верхнем, так и на нижнем регистре. Если не найдено ничего, то ничего и не выводится на экран. Опция просмотра начинается со строки 61. Сначала выводится заго- ловок в фоновом режиме. Это делается для быстроты. На самом деле это просто эксперимент для того, чтобы увидеть, будут ли асинхронные собы- тия производить вывод на экран синхронно. В данном случае это именно так. Файл выводится командой more. Пока утилита more постранично выво- дит файл, все ее команды нам доступны. (Наш командный файл m в главе 4 иллюстрирует, что мы можем делать с помощью more.) В строке 63 выводится сообщение пользователю о том, что он должен нажать возврат каретки. Строка 64 выполняет чтение. Эта последователь- ность придерживает распечатанный файл данных на экране, чтобы его строки не пропали при сдвиге вверх. Если бы этих операторов не было, напечаталось бы главное меню и мы потеряли бы то, что находилось в верхней части экрана. Строка 66 выполняет проверку на ошибки для меню в целом. Если вы ввели данные, которые не соответствуют ни одному из предыдущих шабло- нов, то им сопоставляется шаблон *. В этом случае печатается сообщение об ошибке, управление переходит из оператора case в конец цикла while и при следующей итерации этого цикла снова печатается главное меню. ---------------------------------------------------------- ИМЯ: office ---------------------------------------------------------- office Делопроизводитель НАЗНАЧЕНИЕ Обеспечивает простой доступ ко многим утилитам управления делоп- роизводством, которые мы уже рассмотрели. ФОРМАТ ВЫЗОВА office ПРИМЕР ВЫЗОВА office Проверяет мой почтовый ящик и сообщает, пуст ли он m ТЕКСТ ПРОГРАММЫ office 1 : 2 # @(#) office v1.0 Office Manager Author: Russ Sage 2а Делопроизводитель 4 if [ $# -gt 0 ] 5 then echo "office: argument error" >&2 6 echo "usage: office" >&2 7 exit 1 8 fi 10 while : 11 do 12 c 13 set `date` 14 echo " 15 $1, $2 $3 $4 17 Office Menu 18 ----------- 19 Mail 20 News 21 Calendar 22 Phone 23 Automatic Reminders 24 Shell Command 25 to exit 27 press m,n,c,p,a,s or : \c" 29 read CMD 31 case $CMD in 32 "") exit;; 33 m|M) if [ -s /usr/spool/mail/$LOGNAME ] 34 then echo 35 ll /usr/spool/mail/$LOGNAME 36 echo "\nWould yuo like to see it ( y/n): \c" 37 read CMD 38 if [ "$CMD" = "y" ] 39 then echo 40 mail 41 fi 42 else echo "\nNo mail today" 43 fi 44 echo "\nhit \c" 45 read CMD;; 46 n|N) PWD=`pwd` 47 cd /usr/news 48 echo "\nThe following files are news item in /usr/news:\n" 49 lc 50 echo "\nEnter filename or to exit: \c" 51 read NAME 52 while [ "$NAME" != "" ] 53 do 54 if [ -s $NAME ] 55 then echo "\n-------------------" 56 cat $NAME 57 echo "---------------------" 58 else echo "$NAME is not a news file" 59 fi 60 echo "\nEnter filename or to exit: \c" 61 read NAME 62 done 63 cd $PWD;; 64 c|C) echo "\n" 65 today 66 if [ -s $HOME/calendar ] 67 then echo "Calendar file:\n`ll $HOME/ calendar`" 68 echo "\nCalendar notifications:" 69 PWD=`pwd` 70 cd $HOME 71 calendar 72 cd $PWD 73 echo "\nCheck your mail for calendar notifications" 74 else echo "\nYou do not have a calendar file at $HOME" 75 fi 76 echo "\nhit \c" 77 read CMD;; 78 p|P) phone;; 79 a|A) greet 80 $HB/at 11:45 echo ^GLunch in 15 minutes 81 $HB/at 16:45 echo ^GShift change in 15 minutes 83 echo "\nYou will receive notices at 11:45 & 4:45" 84 echo "\nWould you like to leave some reminders (y/n): \c" 85 read CMD 86 if [ "$CMD" = "y" ] 87 then echo "\nThe syntax is: at HR:MN executable_phrase" 88 echo "The time now : `date '+%T'`" 89 echo "\n\ncmd ( to exit): \c" 90 read CMD 91 while [ "$CMD" != "" ] 92 do 93 eval $CMD 94 echo "cmd ( to exit ): \c" 95 read CMD 96 done 97 fi;; 98 s|S) echo "\nenter command: \c" 99 read CMD 100 eval $CMD 101 echo "\nhit \c" 102 read CMD;; 103 *) echo "\nInvalid command" 104 echo "\nhit \c" 105 read CMD;; 106 esac 107 done ПЕРЕМЕННЫЕ СРЕДЫ ВЫПОЛНЕНИЯ CMD Содержит различные команды на разных уровнях меню HOME Еще одна экспортируемая переменная, взятая из среды выполнения LOGNAME Shell-переменная, предварительно экспортированная NAME Содержит имя файла с новостями ОПИСАНИЕ ЗАЧЕМ НАМ НУЖЕН office? Многие инструментальные средства в системе UNIX могут выполнять полезные функции, относящиеся к делопроизводству. В силу способа орга- низации UNIX, это отдельные и самостоятельные средства. Для того чтобы узнать о них, необходимо найти все эти средства в справочных руко- водствах, изучить каждое из них и все время помнить, как с ними рабо- тать. Это очень неудобно. Кроме, того, нам необходимо добавить ряд мощных команд к нашему UNIX, включая несколько отдельных управляемых с помощью меню утилит. Каким образом мы можем все это об'единить? Нам необходим механизм, с помощью которого мы можем получить доступ ко всем функциям, имеющим отношение к делопроизводству. Если использовать меню, мы сможем вызывать каждую функцию нажатием одной клавиши. ЧТО ДЕЛАЕТ office? Office представляет собой попытку собрать наиболее часто исполь- зуемые функции делопроизводства в один пакет, управляемый с помощью меню. Тем самым office упрощает вызов этих функций, поскольку вам не обязательно знать, где эти утилиты размещаются и как к ним обращаться. Если у вас есть помощник-секретарь без всякого опыта работы в системе UNIX, вы можете поручить ему выполнение многих из этих функций. Вы мо- жете добавить новые функции и уровни меню, если это необходимо. В office имеются как неотъемлемые общие функции делопроизводства, так и специфические добавки. Данная утилита пытается управлять как основными функциями, так и кругом задач по вашему вкусу. К базовым функциям относятся почта, новости, календарь и база телефонных номе- ров. Добавляемые особенности включают в себя систему напоминаний, основанную на утилите at, и возможность запуска еще одного командного интерпретатора shell, не выходя из программы office. Благодаря всем этим качествам, все находится в одном месте и обеспечивается простота доступа и сопровождения. Главное меню содержит все доступные функции. Оно выглядит так: ----------------------- | | Fri, Jun 20 16:18:23 | | Office Menu | ----------- | Mail (Почта) | News (Новости) | Calendar (Календарь) | Phone (Телефоны) | Automatic Reminders (Автоматические напоминания) | Shell Command (Переход в shell) | to exit (Выход) | | press m,n,c,p,a,s or : | День и дата в левом верхнем углу получены командой UNIX date. Каждый раз при выводе меню печатается новое значение времени. Оно сообщает вам о том, когда вы начали работать с этим меню, и как долго вы работали. Первым вариантом выбора является почта. Здесь ваш почтовый файл проверяется на ненулевой размер. Если размер нулевой (или такой файл отсутствует), выводится сообщение "no mail today" (сегодня почты нет). Если для вас есть почта, то информация из файла почтового ящика распе- чатывается в длинном формате командой ls и выводится запрос о том, хо- тите ли вы прочитать вашу почту. Если вы сказали "yes" (да), выполня- ется обычная команда UNIX mail. Вторым вариантом выбора являются новости. Файлы новостей хранятся в одном каталоге, где каждая порция новостей представляет собой неза- висимый файл. Все порции новостей хранятся в специальном каталоге с именем /usr/news. Office выводит список всех файлов новостей и затем спрашивает, хотите ли вы просмотреть один из них. Если да, введите имя файла - и он распечатается командой more. Мы предполагаем, что у вас есть сетевая связь между пользователями или какое-то другое средство для получения новостей. Третий вариант выбора - календарь. Поскольку с календарем связана разнообразная информация, данная опция подразделяется на различные функции. Сначала выводится полностью календарь на текущий месяц с вы- деленной сегодняшней датой. Это делается с помощью утилиты today, рассмотренной ранее. Затем выполняется обращение к системной утилите работы с календарем. Если в вашем регистрационном каталоге есть файл с именем calendar, то утилита calendar (выполняемая командой cron для просмотра каждого регистрационного каталога) просматривает записи ва- шего календаря. Если какие-либо записи относятся к сегодняшнему или завтрашнему дню, эта утилита посылает их вам по почте. Командный файл 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 для подделки времени создания, вы никогда не будете иметь уверенности в том, что файл не был изменен. Какое же все это имеет отношение к определению того, делал ли пользоват