|
24.08.1999, | ||
Человеческий скрипт для соединения
| |||
Поскольку кермитовский скрипт никуда годен, напишем свой скрипт для соединения с провайдером. Вполне приличный скрипт для дозвонки можно сделать из подручных средств, например, с помощью chat, тем более, что man pppd именно его и рекомендует. chat идеально подходит для создания сценария диалога в стиле "чего ожидаем" - "и как на это реагируем".
Этот сценарий может быть записан в файле, и с помощью
ABORT "ERROR" ABORT "NO DIALTONE" TIMEOUT 5 "" "AT" "OK"-"+++"-"" "AT" "OK" "ATZ" "OK" "ATS7=120" ABORT "BUSY" ABORT "NO ANSWER" ABORT "NO CARRIER" ABORT "Login incorrect" "OK" "ATDP5551234" TIMEOUT 125 "CONNECT" "\c" TIMEOUT 30 "ogin:" "igor" "assword:" "1234567" "}" "\c" Для удобства восприятия сценарий представлен в виде двух колонок - чего ждём из модема и как на это реагировать. Но, на самом деле, chat игнорирует все переносы строк и воспринимает сценарий в виде одной строки, состоящей из пар. Для управления диалогом существует несколько зарезервированных слов, таких как ABORT и TIMEOUT, воспринимаемых chat как команды. Эти команды должны находится на месте строк ожидания, иначе chat примет их за наш ответ. Ответы модема и нашу реакцию на них мы указали в кавычках, для того чтобы их было легче распознать среди команд.
Напротив команды ABORT указывается строка,
встретив которую, chat завершит работу с ненулевым кодом выхода.
В данном случае это строки "ERROR" и
Пустая строка "" в первой колонке означает, что из модема
ничего ждать не надо и можно сразу посласть в
Затем идет несколько странная строка. Работает она следующим образом.
Мы ждём
Дождавшись
Затем, мы определяем ещё несколько строк, встретив которые,
chat должен прекратить работу.
Это строки "BUSY", После этого мы начинаем набирать номер и устанавливаем время ожидания строки "CONNECT" 125 секунд. Обратите внимание, что указать это время ожидания только для chat недостаточно, необходимо, что бы и модем знал о времени, в течение которго он будет ждать соединения. У большинства модемов это время равно 60 секундам и изменить его можно с помощью команды "ATS7=120", что мы и делаем сразу после сброса модема. Я бы рекомендовал устанавливать время ожидания соединения для pppd на пару-тройку секунд больше, чем у модема. В данном случае это не критично, но для набора нескольких номеров это необходимо. После получения строки "CONNECT" мы уменьшаем время ожидания приглашения провайдера до 30 секунд. Строка "\c" во второй колонке означает, что писать в модем ничего не надо и можно стразу переходить к следующей строке ожидания - "ogin:". В этот момент перед взором chat предстает примерно такая картина (критичные для нашего сценария строки выделены): CONNECT 14400/ARQ/V42b Cool Connection Internet Service Provider login: В ответ на "ogin:" мы вводим своё имя - "igor", которое у Вас будет, естественно, другим. После этого мы ждём строку "assword:" и в ответ вводим наш пароль "1234567". Вместо строк "ogin:" и "assword:" можно ожидать и полные варианты - "login:" и "Password:", если, конечно, Вы уверены, что они выглядят именно таким образом. После ввода пароля мы получим либо фразу о том, что "Login incorrect", и chat прекратит работу с ненулевым кодом выхода, либо на той стороне появится что-то PPP-образное, радующее нас примерно вот такими зюками: ~Ъ}#ю!}!}!} }.}%}&SЫы(}'}"}(}"Ё[~
При появлении первой из таких
Отладить этот скрипт можно, даже не используя pppd,
не соединясь с провайдером и, более того, даже не имея модема.
Дело в том, что chat считывает из стандартного потока
ввода - stdin, а выводит в стандартный поток
вывода - stdout.
Кроме того, у chat есть Итак, запустив chat -v -s -f /etc/ppp/script мы можем отладить наш сценарий, даже не имея модема. Как то же самое будет выглядить с модемом и живым провайдером, мы увидим в статье Звоним провайдеру.
Если Вы попробовали отладить наш сценарий,
с "ogin:" "igor" "assword:" "\q1234567" "}" "\c"
В нашем сценарии мы предполагали, что после ввода пароля
на удалённой стороне должно появится что-то, понимающее PPP.
Но если Вы залогинились на машину, на которой работает FreeBSD, и
в качестве шелла у Вас указан не /usr/sbin/pppd,
а, например, /usr/local/bin/bash,
то скрипт необходимо изменить, что бы он в ответ на приглашение
"ogin:" "igor" "assword:" "1234567" "$" "exec /usr/sbin/pppd" "}" "\c"
|