Набор номера с chat
Одна из вещей, которая может испугать Вас как неудобная в вышеизложенным примере - то, что Вы должны установить связь вручную прежде, чем Вы могли бы запустить pppd. В отличие от dip, pppd не имеет собственный script язык для набора незначительной системы и регистрации, но полагается на некоторую внешнюю программу или shell script для того, чтобы сделать это. Команда, которая будет выполнена может быть дана pppd с connect командой line option. Pppd переназначит вход и выход к последовательной линии. Одна полезная программа для этого - expect, написанная Don Libes. Она имеет очень мощный язык основанный на Tcl, и была разработана точно для этого сорта приложения.
Pppd пакет идет с подобной программой называемой called chat, которая позволяет Вам определить UUCP-style chat script. В основном, chat script состоит из чередующихся последовательности строк, которые мы ожидаем получить от отдаленной системы, и ответов, которые мы должны послать. Мы будем называть expect и send строки, соответственно. Это типичная выборка из chat script;
ogin: b1ff ssword: s3kr3t
Он сообщает chat чтобы ждать отает из отдаленной системы для того, чтобы послать login prompt, и вернуть login имя b1ff. Мы только ждем ogin: так чтобы было все равно стартует ли login prompt с верхнего регистра или с нижнего регистра I, или приходит искаженным. Следующяя строка - expect string снова, которая заставит chat ждать пароль, и посылать свой пароль в ответ.
Вот это в основном и все то, для чего предназначен chat scripts. Полный script для соединения с 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 script работает точно так, как описано выше.
Опция - v делает caht log all activities к syslog daemon's local2 facility. (6)
Определение chat script на командной строке несет оправданный риск, потому что пользователи могут просматривать командную строку процессов с использованием ps команды. Вы можете избежать этого, помещая chat script в файл, скажем dial-c3po. Вы можете заставить chat прочесть script из файла вместо командной строки, давая ему опцию -f, сопровождаемой именем файла. Завершением колдовства над pppd теперь выглядело бы следующим образом:
# pppd connect "chat -f dial-c3po" /dev/cua3 38400 -detach \ crtscts modem defaultroute
6. Если Вы редактируете syslog.conf так, чтобы переназначить эти log сообщения к файлу, удостоверитесь, что этот файл не всемирно читаемый, так как chat также регестрирует введенный chat script по умолчанию - включая пароли и все.
Помимо соединяющейся опции, которая определяет dial-up script, мы добавили еще две опции к командной строке: - detach, которая сообщает рppd не отделяться от консоли и стать процессом предпосылки. Ключевое слово модема заставит его выполнить некоторые модем-определенные действия на последовательном устройстве, подобно "повесить трубку" прежде и после вызова. Если Вы не используете это ключевое слово, pppd не будет определять DCD линию, и будет не обнаруженна неожиданно.
Примеры, показанные выше были довольно просты; chct позволяет учитывать намного более комплексные chat script. Одна очень полезная особенность - способность к точному определению строки на которой можно прервать chat с ошибкой. Типичные аварийные строки - BUSY, или NO CARRIER, которые ваш модем обычно генерирует, когда вызываемый номер занят, или не поднимают трубку. Для того, чтобы сделать chat распознающим их немедленно, скорее быстрее чем выйдет время, Вы можете определить начало script, используя ключевое слово ABORT.
$ chat -v ABORT BUSY ABORT 'NO CARRIER' '' ATZ OK ...
В подобном режиме, Вы можете изменить значение блокировки по времени для частей chat scripts, вставляя TIME OUT опции. Для деталей, пожалуйста обратитесь к chat(8) справочника.
Иногда, вы может быть захотели бы иметь некоторый вид условного извлечения частей chat script. Например, когда Вы не получаете отдаленный end'slogin prompt, возможно Вы можете захотеть послать BREAK, или возврат каретки. Вы можете достичь этого, присоединяя sub-script к expect строке. Она состоит из последовательности send- и expect- строк, точно таких же как и полный script непосредственно, который отделен дефисами. Sub-script выполняется всякий раз, когда expected строка когда не было ничего получено. В примере изложенном выше, мы модифицировали бы chat script следующим образом:
ogin:-BREAK-ogin: ppp ssword: GaGariN
Теперь, когда chat не видит, что отдаленная система посылает быстрый вход в систему, sub-script выполняется сначала посылая BREAK, и затем ожидает для входа в систему снова. Если prompt теперь появится, то script будет продолжаться как обычно, иначе это прервется с ошибкой.