Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

Использование скрипта для автоматического дозвона

Одна из вещей, которые могут испугать Вас как неудобные в вышеизложенном примере то, что Вы должны установить связь вручную прежде, чем запустить pppd. В отличие от dip, pppd не имеет собственного языка скриптов для набора номера и регистрации, а полагается на внешнюю программу или shell-скрипт для того, чтобы сделать это. Команда, которая будет выполнена, может быть передана pppd опцией connect командной строки. pppd переназначит ввод и вывод к последовательной линии. Пакет pppd имеет очень простую программу chat для этих целей.

Хорошая альернатива для этого expect, написанная Don Libes. Она имеет очень мощный язык, основанный на Tcl, и была разработана для этого типа приложений. Именно ее стоит использовать в случае длинного и сложного процесса входа в систему.

Программа chat позволяет Вам определить скрипт в стиле UUCP. В основном скрипт состоит из последовательности чередующихся строк, которые ожидается получить от удаленной системы, и ответов, которые мы должны ей послать. Мы будем называть expect и send строки, соответственно для приема и передачи. Типичная часть chat-скрипта:
ogin: b1ff ssword: s3|<r1t

Он сообщает chat, что нужно ждать ответ удаленной системы с запросом имени пользователя (login prompt) и вернуть ей в ответ имя b1ff. Мы ждем только ogin: таким образом, не имеет значения с символа в верхнем или нижнем регистре начинается запрос, или он приходит искаженным. Следующяя строка заставит chat ждать запрос пароля и послать свой пароль в ответ.

Это, в основном, все то, для чего предназначены chat-скрипты. Полный скрипт для соединения с PPP-сервером должен включать соотствующие команды модема. Допустим, что модем понимает Hayes команды, и номер телефона сервера 318714. Полный вызов chat для установки связи с c3po:
$ chat -v '' ATZ OK ATDT318714 CONNECT '' ogin: ppp word: GaGariN

По определению, первая строка должна быть expect-строкой, но так как модем не будет сообщать что-нибудь прежде, чем мы запустим его, запустим chat так, чтобы он сначала ожидал пустую строку. Мы посылаем ATZ, команду reset для Hayes-совместимых модемов и ждем реакцию (OK). Следующая строка посылает команду dial с номером телефона для chat и ожидает сообщение CONNECT в ответ. За этим снова следует пустая строка, потому что мы не хотим ничего посылать, но надо подождать для быстрого входа в систему. Остальная часть chat-скрипта работает точно так же, как описано выше.

Опция -v сообщает chat о необходимости вести подробный протокол средствами демона syslog вызовом local2.

Определение chat-скрипта в командной строке несет оправданный риск, потому что пользователи могут просматривать командную строку любого процесса с использованием команды ps. Вы можете избежать этого, помещая chat-скрипт в файл, скажем dial-c3po. Вы можете заставить chat взять скрипт из файла вместо командной строки, передавая ему опцию -f, сопровождаемую именем файла. Наш скрипт dial-c3po будет выглядеть так:
''      ATZ
OK      ATDT318714
CONNECT ''
ogin:   ppp
word:   GaGariN
Слева написаны строки, которые мы ждем, справа наши ответы на них для передачи удаленной машине.
Вызов pppd будет таким:
# pppd connect "chat -f dial-c3po" /dev/ttyS3 38400 -detach \
        crtscts modem defaultroute

Помимо опции connect, которая определяет скрипт дозвона, мы добавили еще две опции в командной строке: -detach, которая сообщает pppd не отделяться от консоли и стать фоновым процессом. Ключевое слово modem заставит его выполнить некоторые действия, специфичные для модема, на последовательном устройстве, подобно "повесить трубку" после вызова. Если Вы не используете это ключевое слово, pppd не будет определять линию DCD и не обнаружит неожиданного обрыва связи.

Примеры, показанные выше были довольно просты; chat позволяет создавать намного более сложные скрипты. Одна очень полезная особенность, это способность к точному определению строки, на которой можно прервать chat с сообщением об ошибке. Типичные аварийные строки BUSY или NO CARRIER, которые модем обычно генерирует, когда вызываемый номер занят или не поднимает трубку. Для того, чтобы сделать так, чтобы chat их распознавал, Вы можете определить начало скрипта, используя ключевое слово ABORT:
$ chat -v ABORT BUSY ABORT 'NO CARRIER' '' ATZ OK ...

В подобном режиме Вы можете изменить значение блокировки по времени для частей скрипта, вставляя опции TIMEOUT.

Иногда нужно иметь возможность условного выполненич частей скрипта. Например, когда Вы не получаете запрос имени пользователя с удаленной машины, возможно, стоит послать BREAK или возврат каретки. Вы можете достичь этого, присоединяя sub-скрипт к expect-строке. Он состоит из последовательности send и expect строк точно таких же, как и обычный скрипт. Sub-скрипт отделяется тире и выполняется всякий раз, когда не было ничего получено в качестве ожидаемой строки. В примере, изложенном выше, мы модифицировали бы chat-скрипт следующим образом:
ogin:-BREAK-ogin: ppp ssword: GaGariN

Теперь, когда chat видит, что удаленная система не посылает запрос на вход в систему, sub-скрипт выполняется, сначала посылая BREAK, а затем снова ожидает запрос для входа в систему. Если теперь запрос появится, то основной скрипт будет продолжаться как обычно, иначе он прервется с сообщением об ошибке.