chat

Автоматизированный сценарий диалогового взаимодействия с модемом

Синтаксис:

chat [опции] сценарий

Опции:

-e
Включите отображение на экране. Включать и выключать отображение на экране можно в конкретных точках сценария chat при помощи ключевого слова ECHO. Когда отображение на экране активировано, то вся выходная информация от модема передается в стандартный поток ошибок stderr.
-f файл_ДВ
Выполнить чтение сценария диалогового взаимодействия из файла файл_ДВ. При использовании этой опции указывать аргумент сценарий не следует. Для файла файл_ДВ должен быть разрешен доступ для чтения. В файле допускается использование нескольких строк. Для разделения строк используются символы пробелов или горизонтальной табуляции.
-r файл
отчета Указать файл для вывода строк отчета. В этот файл записываются соответствующие строки, если используется ключевое слово REPORT. Если эта опция не используется, а ключевое слово REPORT используется, то для записи строк отчета используется поток stderr.
-s
Отправить все журнальные сообщения, полученные в результате применения опций -v, и все сообщения об ошибках в поток stderr.
-S
Не использовать системный журнал для сообщений об ошибках или журнальных сообщений, полученных в результате применения опций -v.
-T номер_телефона
Передать произвольную строку (обычно номер телефона), которая в строке к отправке заменяет метасимвол подстановки \T.
-t таймаут
Установить таймаут для ожидаемой к получению строки. Если строка не получена в течение установленного времени, ответная строка не отправляется. Может быть послан альтернативный ответ. При отсутствии строки с альтернативным ответом сценарий завершается неуспешно. Неуспешное выполнение сценария приводит к тому, что утилита chat завершается с ненулевым кодом ошибки.
-U номер_телефона_2
Передать вторую строку (обычно номер телефона), которая в строке к отправке заменяет метасимвол подстановки \U. Это бывает целесообразно при наборе номера терминального адаптера ISDN, для которого требуется наличие двух номеров.
-V
Вывести расширенную информацию, но отправить весь вывод в поток stderr. Утилита chat регистрирует все текстовые сообщения, полученные от модема, и все отправляемые им выходные строки. Обычно в качестве устройства используется локальная консоль на станции, на которой запущена утилита chat или pppd.
-v
Вывести расширенную информацию. Утилита chat регистрирует все текстовые сообщения, полученные от модема, и все отправляемые им выходные строки. Для записи регистрируемых сообщений требуется запуск утилиты syslogd.
сценарий
Если в файле с помощью опции -f сценарий не указан, то сценарий добавляется в качестве параметров утилиты chat.

Платформы:

ЗОСРВ «Нейтрино»

Целевые архитектуры:

aarch64, arm, armv7, e2k, mips, ppc, x86

Описание:

Утилита chat определяет диалоговый обмен между компьютером и модемом. Основное назначение утилиты состоит в установлении соединения между сервисом протокола двухточечного соединения (Point-to-Point Protocol, PPP) (pppd) и процессом pppd удаленного узла.

Необходимо ознакомиться с функциями модема ( modem_open(), modem_read(), modem_script() и modem_write()) или с программой Photon Dialer, который является альтернативой утилите chat.

Сценарий диалогового взаимодействия

В сценарии диалогового взаимодействия определяется порядок установления связи.

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

ogin:-BREAK-ogin: ppp ssword: hello2u2

В этой строке показано, что утилита chat должна ожидать строку ogin:. Если приглашение на вход в систему не получено в течение выделенного интервала времени, то утилита должна отправить на удаленный узел последовательность прерывания, а затем снова ожидать строку ogin:. Если первая строка ogin: получена, то последовательность прерывания не генерируется.

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


Caution: Поскольку передавать можно только незашифрованные пароли, возможны проблемы с безопасностью.

После строки ответа обычно отправляется символ возврата каретки. Наличие этого символа в строке "ожидается" предусмотрено только в случае специального запроса с использованием последовательности символов \r.

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

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

Самый простой сценарий может выглядеть следующим образом:

ogin: ppp ssword: hello2u2

Другими словами, если ожидается строка …ogin:, то отправляется строка ppp, а если ожидается строка …ssword:, то отправляется строка hello2u2.

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

ogin:--ogin: ppp ssword: hello2u2

Этот сценарий предпочтительнее, чем приведенный ранее простой сценарий. В нем ожидается то же приглашение login:; однако, если оно не получен, то отправляется последовательность из единственного символа возврата каретки, после чего снова ожидается login:. Если из-за помех в линии передачи первое приглашение на вход в систему пропущено, то обычно при отправке пустой строки приглашение на вход в систему генерируется повторно.

Строки сброса

Многие модемы сообщают о статусе вызова в виде строки, например, следующего вида CONNECTED (соединение установлено), NO CARRIER (сигнал отсутствует) или BUSY (занято). Часто, при неуспешности подключения модема к удаленному узлу, сценарий желательно завершить. Трудность состоит в том, что в сценарии точно не известно, какая строка может быть получена от модема. В какой-то момент времени может быть получена строка BUSY (занято), а в другой момент – строка NO CARRIER (сигнал отсутствует).

Строки сбоя могут быть заданы в сценарии с помощью последовательности ABORT. В сценарии это выглядит следующим образом:

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

В этой последовательности не указано ожидания; затем отправляется строка ATZ. Ожидаемый ответом является строка OK. Если получен ответ OK, то для набора номера телефона утилита chat отправляет строку ATDT5551212. Ожидается получение строки CONNECT. Если строка CONNECT получена, то выполняется оставшаяся часть сценария. Однако при обнаружении модемом занятости телефонной линии он отправляет строку BUSY (занято). Таким образом, строка соответствует сбросу последовательности символов. В этом случае сценарий завершается неуспешно, поскольку найдено соответствие со строкой сброса. По этой же причине сценарий прекращается при приеме строки NO CARRIER (сигнал отсутствует). Может быть получена любая из этих строк. Любая из этих строк завершает сценарий chat.

Строки отчета

Действие строки “report” похоже на действие строки ABORT. Разница заключается в том, что все символы до следующего управляющего символа, например возврата каретки, записываются в файл отчета.

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

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

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

REPORT CONNECT ABORT BUSY '' ATDT5551212 CONNECT '' ogin: account

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

Таймаут

Начальное значение таймаута составляет 45 сек.; это значение можно изменить с помощью опции -t.

Для изменения значения таймаута в следующей ожидаемой строке необходимо указать строку TIMEOUT. Пример:

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

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

Измененное значение таймаута действует до внесения новых изменений.

Отправка символа EOT (конец передачи)

Специальная строка ответа EOT указывает на необходимость отправки утилитой chat символа EOT на удаленный узел. Обычно это последовательность символов конца файла. После EOT символ возврата каретки не отправляется. Последовательность EOT может быть встроена в строку отправки с помощью последовательности ^D.

Генерация прерывания

Специальная строка ответа, содержащая ключевое слово BREAK, приводит к отправке условия прерывания. Прерывание является специальным сигналом на передатчике. Нормальная обработка на получающей стороне состоит в изменении скорости передачи. Эту ситуацию можно использовать для циклического перебора доступных скоростей передачи на удаленном узле до получения действительного приглашения login:. Последовательность прерывания может быть встроена в строку отправки с помощью последовательности \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 Да Отправка или ожидание символа табуляции.
\\ Да Отправка или ожидание символа обратной косой черты.
\ddd Да Сворачивание восьмеричных цифр ddd в одиночный ASCII-символ и отправка этого символа. (Некоторые символы в управляющих последовательностях недопустимы.)
^C Да Подстановка последовательности с управляющим символом, представленным C. Например, символ DC1 (17) отображается как ^Q. (Некоторые символы в управляющих последовательностях недопустимы.)

Возвращаемое значение:

0
Нормальное завершение программы. Это означает, что сценарий выполнен до конца и без ошибок.
1
Один или более параметров недействительны, или слишком длинная ожидаемая строка для внутренних буферов. Это означает, что программа не была выполнена должным образом.
2
Во время выполнения программы возникла ошибка. Возможно, по какой-то причине операции чтения или записи завершились неуспешно или утилита chat получила сигнал, например SIGINT.
3
Произошло событие таймаута при наличии ожидаемой строки и отсутствии строки "– дополнительно к отправке". Это может означать, что сценарий написан некорректно для этого условия или произошло какое-то неожиданное событие, а ожидаемая строка не была найдена.
4
Обнаружена первая строка, отмеченная как условие ABORT.
5
Обнаружена вторая строка, отмеченная как условие ABORT.
6
Получена третья строка, отмеченная как условие ABORT.
7
Обнаружена четвертая строка, отмеченная как условие ABORT.
Другие коды завершения также являются строками, отмеченными как условие ABORT.

С помощью кодов завершения можно определить событие, которое вызвало завершение сценария. С их помощью можно выяснить, была ли получена от модема строка BUSY (занято) или строка NO DIALTONE (сигнал отсутствует). Если при первом событии можно повторить попытку, то при втором событии повторная попытка представляется нецелесообразной.

Классификация:

Базовые подсистемы ЗОСРВ «Нейтрино»

В ЗОСРВ «Нейтрино» редакции 2020 утилита обновлена до версии 2.4.7 (ppp)

Тематические ссылки:

syslogd

modem_open(), modem_read(), modem_script(), modem_write()




Предыдущий раздел: Утилиты