Главная · Поиск книг · Поступления книг · 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 ... 44 45 46 47 48 49 50  51 52 53 54 55 56 57 ... 71

     Если указана опция -u, в переменную OPT добавляется -u и наше ре-
гистрационное имя.  Если аргументом являются любые другие  данные,  то
они  просто добавляются в переменную OPT.  Поступая таким образом,  мы
можем передать в командной строке acme другие опции  команде  acctcom.
Обратите внимание, что здесь не выполняется проверка на ошибки в аргу-
ментах командной строки.  Вы можете ввести неверное значение,  которое
нарушит работу команды acctcom.  Однако это та цена, которую мы вынуж-
дены платить за гибкость при передаче аргументов в  командной  строке,
иначе нам придется значительно увеличивать текст командного файла.

     После того  обработки  всех  опций строка 21 выводит на экран ко-
мандную строку,  которая должна быть выполнена,  так что мы знаем, что
мы  задавали.  В строке 22 выполняется сама команда acctcom.  Выходной
результат соответствует описанию acctcom(1).

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

ИМЯ:   inuse
---------------------------------------------------------------------------

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

     НАЗНАЧЕНИЕ

     Блокирует ваш терминал путем перевода в состояние занятости. Если
кто-либо попытается вторгнуться, вы это заметите.

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

inuse

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

inuse     Перевод терминала в состояние занятости
mypasswd  Вводится мой пароль, но не отображается на экран

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

1   :
2   # @(#) inuse v1.0  Disable terminal and alert if used  Author: Russ Sage
2а    Запретить использование терминала и сообщить о попытке использования

4   trap "echo you\'re BUSTED!!; stty echo; kill $$" 2 15

6   PATH=/bin:/usr/bin
7   SECRET="secret"

9   stty -echo
10  echo "Lock string: \c"
11  read BUF1
12  echo

14  while :
15  do
16          BUF2=`line < /dev/tty`
17          if [ "$BUF2" = "$BUF1" ]
18            then  break
19          elif [ "$BUF2" = "$SECRET" ]
20            then  break
21          fi
22          echo "^G\c"
23  done
24  stty echo

       ОПИСАНИЕ

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

     Рабочий день всегда загружен: много людей, еще больше бумаг, вся-
кие поручения и так далее и так далее. Когда вы покидаете свое рабочее
место,  что вы собираетесь делать со своим зарегистрированным термина-
лом?  Каждый раз входить в систему и выходить из нее слишком долго, но
вы не хотите оставлять вашу работу открытой для всех.  Вам  необходима
программа,  которую  вы  можете запустить на время вашего отсутствия и
которая не позволит другим людям использовать то, что вы делаете.

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

                          ЧТО ДЕЛАЕТ inuse?

     Inuse переводит ваш терминал в режим вечной работы. Это означает,
что терминал не отвечает на ваши запросы или запросы кого-то  другого.
Когда вы готовы разблокировать ваш терминал,  введите секретный пароль
или пароль, который вы придумали.

     Когда вы первый раз вызываете inuse,  у вас запрашивается пароль.
Эхо-отображение на терминал отключено,  поэтому пароль не выводится на
экран. Для гарантии того, что никто не пытается переадресовать команд-
ному файлу inuse какой-либо файл данных,  все операции чтения произво-
дятся непосредственно из файла терминального устройства /dev/tty, а не
через файловый дескриптор стандартного ввода. Это позволяет защититься
от попыток других пользователей вторгнуться в работу  терминала  путем
посылки на стандартный ввод файла большого размера, содержащего разные
слова.

     После чтения вашего пароля inuse попадает в бесконечный цикл, ко-
торый читает символы с клавиатуры и сравнивает полученные входные дан-
ные с двумя паролями.  Каждый раз,  когда кто-то вводит что-то  некор-
ректное,  выдается звуковой сигнал. Когда же введен один из допустимых
паролей, программа останавливается и терминал разблокируется.

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

     ПОЯСНЕНИЯ

     Строка 4 инициализирует оператор trap. При активизации обработчи-
ка trap выполняются три команды.

     Целью применения  ловушки trap является реагирование на любую по-
пытку прервать работу командного файла и прорваться на  ваш  терминал.
Первая команда выдает предупреждение о том, что вы вторгаетесь. Вторая
команда переключает терминал обратно в режим эхо-отображения,  так что
все, что будет впоследствии введено с клавиатуры, отобразится на экра-
не.  и последняя команда заставляет программу совершить  самоубийство.
Как мы увидим позже,  это самоубийство является особым родом прекраще-
ния работы программы.  Обращение к "самому себе" в операторе kill  вы-
полняется с использованием метасимволов $$, которые представляют собой
идентификационный номер выполняющегося shell-процесса.  Обработчик ло-
вушек  включается  сигналами  2  и 15,  которыми являются прерывание и
программное завершение соответственно.  Отметим,  что сигнал выхода из
программы (сигнал 3) здесь не используется.  Причину этого мы объясним
позже.

     Строка 6 устанавливает  маршрут,  по  которому  может  обращаться
inuse.  Тем  самым  inuse  никогда не сможет быть "застигнут врасплох"
кем-нибудь, кто проник незаметно (в "троянском коне"). Строка 7 иници-
ализирует секретный пароль значением "secret",  которое совсем не сек-
ретно.  Вы можете изменить пароль на любое слово перед установкой  ко-
мандного  файла в вашей системе.  В правах доступа к файлу,  в котором
хранится текст данной shell-программы, вы должны запретить возможность
чтения.  В противном случае другие пользователи смогут увидеть секрет-
ное слово.

     Строка 9 отключает эхо-отображение, строка 10 печатает запрос па-
роля,  а строка 11 читает пароль,  который вы вводите, и заносит его в
переменную BUF1.

     Строки 14-23 представляют собой вечный цикл while,  который можно
прервать  только  вводом  правильного пароля.  Строка 16 читает ввод с
клавиатуры.  При нажатии возврата каретки строка 17  проверяет,  соот-
ветствует ли то,  что введено с клавиатуры,  паролю пользователя. Если
нет,  переменная BUF2 сравнивается с секретным паролем.  Если какой-то
из паролей совпадает,  оператор break производит выход из цикла while,
тем самым прекращая выполнение программы.  Если  введенные  данные  не
соответствуют  ни одному из паролей,  то в строке 22 выдается звуковой
сигнал и снова начинает выполняться оператор чтения клавиатуры.

     Если пароль введен правильно,  в строке 24 включается эхо-отобра-
жение на терминал и программа завершается. Если происходит прерывание,
активизируется оператор trap. Данная операция подробно рассматривается
ниже.

     ПОДРОБНЕЕ О ЛОВУШКАХ

     Нам нужно рассмотреть смысл клавиши выхода из программы. Она про-
изводит прерывание,  похожее на все другие прерывания,  но кроме  того
выводит дамп памяти для запущенного процесса. Мы оставляем клавишу вы-
хода  нетронутой  оператором  trap,  поскольку  она  становится  нашей
последней  надеждой  на приостановление командного файла inuse.  Когда
ваш терминал заблокирован,  он эхо-отображает  вводимые  с  клавиатуры
символы,  но не реагирует на них.  Тот, кто нажимает на клавиши, видит
это и пытается выйти из ситуации, нажимая на клавишу прерывания (обыч-
но это клавиша DEL). Когда он это делает, на экран выводится сообщение
"you're busted", эхо-отображение снова включается и программа сама се-
бя уничтожает (сигнал 15).  Когда сигнал уничтожения принимается прог-
раммой,  этот сигнал ловится,  печатается сообщение и программа  снова
сама себя уничтожает.  Эта последовательность выполняется снова и сно-
ва, как в вечном цикле. Каждый раз, когда ловушка уничтожается и снова
запускается,  используется стек. Если все это будет выполняться доста-
точно долго,  то весь стек заполнится записями об активизации и  пере-
полнится, аварийно завершая весь сеанс работы.

     Если клавиша  выхода  будет нажата до активизации оператора trap,
то программа завершится чисто.  Если же клавиша  выхода  будет  нажата
после начала работы оператора trap,  то произойдет выдача дампа памяти
процесса и программа завершится. Это не совсем честный прием, но прог-
раммирование на языке shell вынуждено быть именно таким, и это предуп-
реждает вас о том, что что= то не в порядке.

     Текущие значения клавиш для сигналов прерывания и выхода  отобра-
жаются командой stty(1).  Эти значения можно переустановить в любые по
вашему желанию. У меня текущие установки такие:

speed 9600 baud; intr = DEL; quit = ^|; erase = ^h; kill = ^u;
eof = ^d;

     Набрав на клавиатуре "stty intr z", вы можете установить символ z
в качестве сигнала прерывания ваших процессов, поэтому такое изменение
клавиши  прерывания и запуск бесконечного цикла представляет собой еще
один способ защиты вашего сеанса работы. Поскольку вам потом нужно бу-
дет  вернуть старое значение,  вы должны запомнить то,  что вы делали.
Такой настройкой сигналов вы можете делать с  вашим  терминалом  почти
все, что хотите. Этот подход дает меньшую степень защиты, чем перехват
прерываний,  но может обеспечить вас минимальной защитой, не приводя к
выдаче дампа памяти.

     Теперь мы представляем версию на языке Си.

                  ТЕКСТ ПРОГРАММЫ inuse НА ЯЗЫКЕ СИ

1   char id[] = "@(#) inuse v1.0 Disable terminal Author: Russ Sage";

3   #include
4   #include
5   #include

7   #define SSIZ 7
8   #define BSIZ 512
9   #define BELL "\07"
10  #define LF   "\n"

12  main()
13  {
14          register int fd, sig, n;
15          char    secret[SSIZ];
16          char    buf1[BSIZ], buf2[BSIZ];
17          struct  sgttyb sav_tty, chg_tty;

19          secret[0] = 's';
20          secret[1] = 'e';
21          secret[2] = 'c';
22          secret[3] = 'r';
23          secret[4] = 'e';
24          secret[5] = 't';
25          secret[6] = '\n';

27          buf1[0] = buf2[0] = '\0';
28          if ((fd = open("/dev/tty",O_RDONLY)) == -1)
29                  exit(1);

31          for (sig = 2; sig <= 15; sig++)
32                  signal(sig, SIG_IGN);

34          if (gtty(0, &sav_tty))
35                  exit(2);
36          chg_tty = sav_tty;
37          chg_tty.sg_flags &= ~ECHO;
38          if (stty(0, &chg_tty))
39                  exit(3);

41          write(1,"Lock string: ",13);
42          read(fd, buf1, BSIZ);
43          write(1, LF, 1);

45          for (;;) {
46                  n = read(fd, buf2, BSIZ);
47                  buf2[n] = '\0';

49                  if (strcmp(buf2, buf1) == 0)
50                          break;
51                  if (strcmp(buf2, secret) == 0)
52                          break;
53                  write(1, BELL, 1);
54          }
55          stty(0, &sav_tty);
56          close(fd);
57  }

       ОПИСАНИЕ

                ЗАЧЕМ НАМ НУЖНА ПРОГРАММА inuse (Си)?

        Версия inuse на языке Си работает почти так же,  как  и
версия  на языке shell. Основное отличие заключается в том, что
командные файлы на языке  shell  пользуются  командами  раздела
(1), в то время как программы на Си используют команды разделов
(2) и (3).

                   ЧТО ДЕЛАЕТ ПРОГРАММА inuse (Си)?

     Теоретические основы   функционирования   такие   же,   как  и  в
shell-версии.  Инициализируется секретный пароль (в данном случае при-
Предыдущая страница Следующая страница
1 ... 44 45 46 47 48 49 50  51 52 53 54 55 56 57 ... 71
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (52)

Реклама