Автоматизированный сценарий диалогового взаимодействия с модемом
chat [опции] сценарий
ECHO
. Когда отображение на экране активировано, то вся выходная информация от модема передается в стандартный поток ошибок stderr.REPORT
. Если эта опция не используется, а ключевое слово REPORT
используется, то для записи строк отчета используется поток stderr.ЗОСРВ «Нейтрино»
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.
![]() | Поскольку передавать можно только незашифрованные пароли, возможны проблемы с безопасностью. |
После строки ответа обычно отправляется символ возврата каретки. Наличие этого символа в строке "ожидается" предусмотрено только в случае специального запроса с использованием последовательности символов \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. (Некоторые символы в управляющих последовательностях недопустимы.) |
SIGINT
.ABORT
.ABORT
.ABORT
.ABORT
.ABORT
.С помощью кодов завершения можно определить событие, которое вызвало завершение сценария. С их помощью можно выяснить, была ли получена от модема строка BUSY
(занято) или строка NO
DIALTONE
(сигнал отсутствует). Если при первом событии можно повторить попытку, то при втором событии повторная попытка представляется нецелесообразной.
Базовые подсистемы ЗОСРВ «Нейтрино»
ЗОСРВ
«Нейтрино»
редакции 2020
утилита обновлена до версии 2.4.7 (ppp) modem_open(), modem_read(), modem_script(), modem_write()
Предыдущий раздел: Утилиты