Набор номера с 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

Если Вы  редактируете  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  будет продолжаться как обычно, иначе это прервется с ошибкой.