CHAT(8)

НАЗВАНИЕ
chat - сценарий, автоматизирующий взаимодействие с модемом

ОБЗОР
chat [ опции ] сценарий

ОПИСАНИЕ

Программа chat определяет диалог между компьютером и модемом. Её основное назначение состоит в установке соединения между демоном протокола точка-точка (pppd) и удалённым процессом pppd.

ОПЦИИ

-f <chat-файл>
    Читать chat-сценарий из файла chat-файл. Одновременное использование этой опции и chat-сценария в командной строке запрещено. Пользователь должен иметь право на чтение файла. В файле разрешается указывать несколько строк. Для разделения строк используются пробелы или знаки табуляции.

-t <таймаут>
    Задать таймаут ожидания приёма строки. Ответная строка не будет отправлена, если принимаемая строка не получена в течении указанного времени. Можно отправить альтернативный ответ, но если альтернатива не указана, то сценарий завершится с ошибкой. В случае ошибки программа chat завершится с ненулевым кодом. Вы также можете использовать строку TIMEOUT для указания таймаута.

-r <файл-отчёта>
    Указать файл для вывода строк отчёта. При использовании ключевого слова REPORT строки отчёта будут выведены в этот файл. Если эта опция не используется, но вы всё же используете ключевое слово REPORT, то строки отчёта будут перенаправляться в поток stderr.

-e  Запуск с включённой опцией эхо-отображения. Эхо также может быть включено или выключено в любом месте chat-сценария при помощи ключевого слова ECHO. При включенной опции эхо весь вывод с модема дублируется в поток stderr.

-E  Включить подстановку переменных окружения внутри chat-сценариев с использованием стандартного синтаксиса $xxx.

-v  Попросить, чтобы chat-сценарий исполнялся в подробном режиме. Программа chat будет вести журнал выполнения chat-сценария с данными, полученными от модема, и выводить строки, отправленные модему. По умолчанию ведение журнала осуществляется с помощью SYSLOG; метод ведения журнала может быть изменён флагами -S и -s.

-V  Попросить, чтобы chat-сценарий исполнялся в режиме подробного вывода информации в поток stderr. В этом режиме программа chat будет направлять в поток stderr все строки, полученные от модема и отправленные на него. Поток stderr обычно является локальной консолью компьютера, на котором запущена программа chat или pppd.

-s  Использовать поток stderr. Все сообщения опции '-v' и все сообщения об ошибках будут перенаправлены в stderr.

-S  Не использовать SYSLOG. По умолчанию сообщения об ошибках отправляются в SYSLOG. Опция -S предотвратит отправку сообщений опции '-v' и всех сообщений об ошибках в SYSLOG.

-T <номер-телефона>
    Задаёт произвольную строку, обычно это номер телефона, которая будет заменять метасимвол \T в отправляемой строке.

-U <номер-телефона-2>
    Задаёт вторую строку, обычно номер телефона, которая будет заменять метасимвол \U в отправляемой строке. Это полезно для звонков с терминального адаптера ISDN, требующего двух номеров.

сценарий
    Если сценарий не определён в файле и не указан с помощью опции -f, то сценарий передаётся в виде параметров программы chat.

CHAT-СЦЕНАРИЙ

chat-сценарий определяет обмен сообщениями.

Сценарий состоит из одной или нескольких пар "ожидание-отправка", разделённых пробелами, с необязательной парой строк "подожидание-подотправка", разделённой дефисом, как в следующем примере:

    ogin:-BREAK-ogin: ppp ssword: hello2u2

Эта строка означает, что программе chat следует ожидать строку "ogin:". Если ей не удаётся получить запрос имени пользователя за предоставленный интервал, ей следует отправить последовательность сброса удалённой стороне и ожидать строку "ogin:" снова. Если первый "ogin:" получен, то последовательность сброса не передаётся.

После получения запроса имени пользователя, программа chat отправит строку ppp и будет ждать запроса "ssword:". После получения запроса пароля, она отправит пароль hello2u2.

Сразу за ответной строкой обычно отправляется символ возврата картеки. Он не ожидается в строке "ожидание", если вы не указали её особо с помощью последовательности символов \r.

Ожидаемой последовательности следует содержать только то, что необходимо для идентификации строки. В норме она хранится в файле на диске, поэтому она не должна содержать изменяющейся информации. В общем недопустимо задавать в качестве ожидаемых последовательностей строки с указанием времени, с сетевой идентификацией или другими изменяющимися данными.

Чтобы не зависеть от символов, которые могут быть испорчены при начале передачи данных, задавайте строку "ogin:" вместо "login:". Вероятно что начальная "l" не будет получена из-за ошибки и вы никогда не дождётесь её, несмотря на то что удалённая система её отправила. По этой причине скрипты ищут "ogin:" вместо "login:" и "ssword:" вместо "password:".

Очень простой скрипт может выглядеть так:

    ogin: ppp ssword: hello2u2

Иными словами, ждём ....ogin:, отправляем ppp, ждём ...ssword:, отправляем hello2u2.

На практике простые сценарии встречаются редко. Как минимум, вам следует включить обработку случаев, когда исходная строка так и не получена. Например, рассмотрим следующий скрипт:

    ogin:--ogin: ppp ssword: hello2u2

Этот скрипт лучше, чем более простой, рассмотренный ранее. Он тоже ждёт того же запроса login:, однако, если он его не получит, он отправит символ возврата каретки и опять будет ждать login:. Если шум на линии испортит первый запрос login, отправка пустой строки обычно приводит к повтору приглашения login.

КОММЕНТАРИИ
В chat-сценарий могут быть включены комментарии. Комментарий - это строка, которая начинается с символа # (решётка) в первой позиции. Такие строки комментариев просто игнорируются программой chat. Если символ '#' является первым в ожидаемой строке, поставьте всю строку в кавычки. Если вам необходимо ждать запроса, начинающегося с # (решётка), напишите что-то вроде этого:

    # Ждём запроса и отправляем команду logout
    '# ' logout

ОТПРАВКА ДАННЫХ ИЗ ФАЙЛА
Если строка для отправки начинается с символа (@), остальная часть строки считается именем файла, из которого следует брать строку для отправки. Если последний символ прочитанных оттуда данных - символ новой строки, он будет убран. Файл может быть именованным каналом (или fifo) вместо обычного файла. Это предоставляет программе chat способ общения с другой программой, например, с программой, которая спросит пользователя и получит набранный пароль.

СТРОКИ ABORT
Многие модемы отчитываются о состоянии вызова строкой. Эти строки могут быть CONNECTED, NO CARRIER или BUSY. Часто желательно завершать сценарий, если модем не смог связаться с удалённой стороной. Проблема в том, что сценарий не знает точно, какую именно строку модема он может получить. Один раз он может получить BUSY, а в следующий - NO CARRIER.

Эти строки "сброса" могут быть указаны в сценарии с помощью последовательности ABORT. Она записывается в сценарии, как в следующем примере:

    ABORT BUSY ABORT 'NO CARRIER' ” ATZ OK ATDT5551212 CONNECT

Эта последовательность ничего не ожидает; и затем отправляет строку ATZ. Ожидаемый ответ - строка OK. Когда будет принята строка OK, строка ATDT5551212 совершит телефонный звонок. Теперь ожидается строка CONNECT. Если принята строка CONNECT, выполняется остаток сценария. Однако, если модем определит занятый телефон, он оправит строку BUSY. Это приведёт к совпадению с последовательностью символов сброса. Сценарий даст сбой, поскольку он нашёл совпадение со строкой сброса. Если он примет строку NO CARRIER, он даст сбой по тем же причинам. Может быть принята любая строка, каждая из них завершит chat-сценарий.

СТРОКИ CLR_ABORT
Эта последовательность позволяет очистить установленные до этого строки ABORT. Строки ABORT сохраняются в массиве заранее определённого (во время компиляции) размера; CLR_ABORT очистит занимаемое ими место, так что его смогут использовать новые строки.

СТРОКИ SAY
Директива SAY позволяет сценарию отправить строку для пользователя за терминалом через поток stderr. Если chat был запущен из pppd, и pppd запущен как демон (отключён от управляющего терминала), поток stderr обычно перенаправляется в файл /etc/ppp/connect-errors.

Строки SAY должны быть заключены в одинарные или двойные кавычки. Если требуется вывести строку, содержащую возврат каретки или перевод строки, вы должны явно добавить их к вашей строке.

Строки SAY могут использоваться для задания сообщений о процессе подключения в тех местах, где вы хотите отключить эхо с помощью 'ECHO OFF', но хотите дать знать пользователю о том, что происходит. Например так:

    ABORT BUSY
    ECHO OFF
    SAY "Звоним провайдеру...\n"
    ” ATDT5551212
    TIMEOUT 120
    SAY "Ждём подключения не дольше 2 минут..."
    CONNECT ”
    SAY "Подключение установлено, теперь входим...\n"
    ogin: account
    ssword: pass
    $ SAY "Вход выполнен...\n" и т.д...

Эта последовательность будет представлена пользователю только строками SAY и все детали сценария останутся скрытыми. Например, при работе вышеуказанного сценария, пользователь увидит:

    Звоним провайдеру...
    Ждём подключения не дольше 2 минут... Подключение установлено, теперь входим...
    Вход выполнен...

СТРОКИ REPORT
Строки отчётов похожи на строки ABORT. Разница в том, что строки и все символы до следующего управляющего символа, такого как возврат каретки, будут записаны в файл отчёта.

Строки отчёта могут использоваться для изолирования скорости передачи строки подключения модема и значения, возвращаемого пользователю chat. Анализ строк отчёта логически происходит совместно с другими строками, такими как поиск ожидаемой строки. Использование одинаковых строк для последовательностей отчёта и сброса не очень полезно, однако возможно.

Строки отчёта не изменяют кода завершения программы.

Строки "отчёта" могут быть указаны в сценарии с помощью последовательности REPORT. Они записываются в сценарий, как в следующем примере:

    REPORT CONNECT ABORT BUSY ” ATDT5551212 CONNECT ” ogin: account

Эта последовательность ничего не ожидает; затем отправляет строку ATDT5551212 чтобы вызвать телефон. Ожидается строка CONNECT. Если строка CONNECT принята, выполняется остаток сценария. Вдобавок программа запишет в ожидаемый файл строку "CONNECT" и любые другие символы, такие как скорость подключения.

СТРОКИ CLR_REPORT
Эта последовательность позволяет очистить предыдущие настройки строк REPORT. Строки REPORT сохраняются в массиве предопределённого (при компиляции) размера; CLR_REPORT восстанавливает место занятое очищаемыми записями, так что новые строки могут использовать это место.

ECHO
Опция эха задаёт, будет ли вывод модема продублирован на stderr. Это поведение может быть задано с помощью опции -e, но оно также может управляться ключевым словом ECHO. Пара "ожидание-оправка" ECHO ON включает эхо, а ECHO OFF отключает его. С помощью этих ключевых слов вы можете выбирать, какие части диалога должны быть видимыми. Например, как в этом сценарии:

    ABORT 'BUSY'
    ABORT 'NO CARRIER'
    ” ATZ
    OK\r\n ATD1234567
    \r\n \c
    ECHO ON
    CONNECT \c
    ogin: account

Все выводимые с модема результаты настройки и дозвона не видны, но начиная с сообщения CONNECT (или BUSY), всё будет дублироваться.

HANGUP
Опция HANGUP задаёт, следует ли считать ошибкой то, что модем положил трубку, или нет. Эта опция полезна в сценариях для звонков на системы, которые вешают трубку и делают ответный звонок. Опция HANGUP может быть включена (ON) или выключена (OFF).
Когда опция HANGUP выключена (OFF) и модем кладёт трубку (например, на первом этапе входа в систему с обратным дозвоном), программа chat будет продолжать выполнять сценарий (т.е. ждать входящего звонка и второго этапа входа в систему). Как только поступит входящий звонок, вы должны воспользоваться директивой HANGUP ON, чтобы восстановить нормальную реакцию на повешивание трубки. Вот простой пример сценария:

    ABORT 'BUSY'
    ” ATZ
    OK\r\n ATD1234567
    \r\n \c
    CONNECT \c
    'Callback login:' call_back_ID
    HANGUP OFF
    ABORT "Bad Login"
    'Callback Password:' Call_back_password
    TIMEOUT 120
    CONNECT \c
    HANGUP ON
    ABORT "NO CARRIER"
    ogin:--BREAK--ogin: real_account
    и т.д...

TIMEOUT
Исходное значение таймаута - 45 секунд. Его можно изменить параметром -t. Вы можете также указать "TIMEOUT 0".

Чтобы изменить значение таймаута для следующей ожидаемой строки, можно использовать следующий пример:

    ATZ OK ATDT5551212 CONNECT TIMEOUT 10 ogin:--ogin: TIMEOUT 5 assword: hello2u2

Это задаст таймаут 10 секунд, в течение которого ожидается приглашение login:. Затем таймаут будет установлен в 5 секунд, в течение которого будет ожидаться приглашение для ввода пароля.

Однажды изменённый таймаут сохраняет действие до тех пор, пока не будет изменён снова.

ОТПРАВКА EOT
Особая строка ответа EOT указывает, что программа chat должна отправить символ EOT удалённой стороне. Обычно это последовательность символов End-of-file (конец-файла). После EOT символ возврата каретки не отправляется.

Последовательность EOT может быть внедрена в отправляемую строку с помощью последовательности ^D.

ПОРОЖДЕНИЕ BREAK
Особая строка ответа BREAK вызывает прерывание отправляемой последовательности. Прерывание - это особый сигнал передатчика. Обычная обработка этого сигнала на приёмнике - это изменение скорости передачи. Это можно использовать для циклического переключения доступных скоростей передачи на удалённой стороне, до тех пор пока не получится принять правильное приглашение для ввода имени пользователя.

Последовательность прерывания может быть встроена в отправляемую строку с помощью последовательности \K.

УПРАВЛЯЮЩИЕ ПОСЛЕДОВАТЕЛЬНОСТИ
Ожидаемые и ответные строки могут содержать управляющие последовательности. Все последовательности допустимы в строке ответа, многие из них допустимы в ожидаемых строках. Управляющие последовательности, недопустимые в ожидаемых строках, будут отображены в существующем виде.

”   Ожидать или отправить пустую строку. Если вы отправляете пустую строку, она будет дополнена символом возврата каретки. Эта последовательность может быть парой апострофов или символов кавычек.

\b  Представляет символ забоя последнего символа.

\c  Подавляет символ новой строки в конце строки ответа. Это единственный метод отправить строку без завершающего символа возврата каретки. Он должен быть указан в конце отправляемой строки. Например, последовательность hello\c просто отправит символы h, e, l, l, o (неприменимо в ожидаемых строках).

\d  Задержка в одну секунду. Программа использует sleep(1), который выполнит задержку максимум в одну секунду (неприменимо в строках ожидания).

\K  Вставить BREAK (неприменимо в строках ожидания).

\n  Отправить символ новой строки или перевода строки.

\N  Отправить нулевой символ. Та же последовательность может быть представлена \0 (неприменимо в строках ожидания).

\p  Пауза в долю секунды. Задержка в 1/10 секунды (неприменимо в строках ожидания).

\q  Подавлять запись строки в файл SYSLOG. Вместо неё в журнал будет записана строка ?????? (неприменимо в строках ожидания).

\r  Отправить или ждать символ возврата каретки.

\s  Представляет символ пробела в строке. Это может использоваться, когда нежелательно заключать в кавычки строку, содержащую пробелы. Последовательности 'HI TIM' и HI\sTIM равнозначны.

\t  Отправить или ожидать символ табуляции.

\T  Отправить строку с номером телефона, который указан в опции -T (неприменимо в строках ожидания).

\U  Отправить строку со вторым номером телефона, который указан в опции -U (неприменимо в строках ожидания).

\\  Отправить или ожидать символ обратной косой черты.

\ddd
    Свернуть восьмеричные цифры (ddd) в единственный ASCII-символ и отправить этот символ (некоторые символы неприменимы в ожидаемых строках).

^C  Заменить последовательность на управляющий символ, представленный C. Например, символ DC1 (17) отобразится как ^Q (некоторые символы неприменимы в строках ожидания).

ПЕРЕМЕННЫЕ ОКРУЖЕНИЯ
Переменные окружения доступны внутри chat-сценариев, если в командной строке была указана опция -E. Метасимвол $ используется для указания имени заменяемой переменной окружения. Если запрошенная переменная окружения не установлена, замена не удастся, поскольку переменную нечем будет заменить.

КОДЫ ЗАВЕРШЕНИЯ
Программа может завершать работу со следующими кодами завершения:

0   Нормальное завершение программы. Это указывает на то, что сценарий выполнен без ошибок и завершился нормально.

1   Один или более параметров неправильные или ожидаемая строка слишком велика для внутренних буферов. Это означает, что программа не выполнилась правильно.

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

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

4   Выполнилось условие в первой строке, помеченной как ABORT.

5   Выполнилось условие во второй строке, помеченной как ABORT.

6   Выполнилось условие в третьей строке, помеченной как ABORT.

7   Выполнилось условие в четвёртой строке, помеченной как ABORT.

... Другие коды завершения также соответствуют строкам, помеченным как ABORT.

Используя код завершения можно определить, какое событие завершило сценарий. Можно определить, что с модема была принята строка "BUSY", а не "NO DIAL TONE". Если в первом случае можно попытаться повторить, то во втором случае шанс, что повторная попытка окажется успешной, значительно ниже.

СМОТРИ ТАКЖЕ
Дополнительную информацию о сценариях chat можно найти в документации UUCP. Сценарии chat используются программой uucico.

uucico(1), uucp(1)

АВТОРСКОЕ ПРАВО
Программа chat - общественное достояние. Это не общественная лицензия GNU. Если она сломается, у вас останутся обе части.

АВТОРЫ ПЕРЕВОДА
Перевод на русский язык выполнен на сайте коллективных переводов http://translated.by/. Авторы перевода: Владимир Ступин <wheel69@yandex.ru>, маяк (migdal-or) и другие.