От точки А до точки Б... или что такое РРР 3
От точки А до точки Б.... или что такое РРР
Окончание. Начало в N№ 35, 36
Устанавливаем РРР соединение вручную
Теперь, когда мы создали файлы /etc/ppp/options и /etc/resolv.conf, а также, в случае необходимости, /etc/ppp/pap(chap)-secrets, мы можем проверить правильность настроек этих файлов, установив РРР соединение со своим сервером вручную. Как только мы убедимся, что все работает, мы автоматизируем этот процесс. Для того чтобы сделать это, Ваша коммуникационная программа должна иметь возможность завершения работы без изменения режима работы модема. Minicom может делать это при нажатии комбинации клавиш (или для старых версий программы).
Войдите в свою систему как пользователь root.
Запустите коммуникационную программу (например, minicom), наберите номер телефона сервера своего провайдера. Войдите в систему ( login). Если нужно выполнить команду запуска РРР на сервере, выполните ее. На Вашем экране должен появиться "мусор". Если Ваш сервер использует протоколы PAP или CHAP, удаленная система сама запустит РРР и Вы увидите "мусор" на своем экране до входа в систему. Некоторые сервера ждут нажатия клавиши перед выдачей приглашения.
Теперь выйдите из коммуникационной программы без сброса модема и введите следующую команду:
pppd -d -detach /dev/ttySx 38400 &
Ключ -d включает режим отладки, вся информация, проходящая через последовательный порт, будет сохраняться в log-файле. Это может оказаться полезным, если Вы столкнетесь с проблемами.
Световые индикаторы на модеме (внешнем, разумеется) должны мигнуть, и вскоре РРР-соединение будет установлено. Теперь можно посмотреть на Ваш РРР интерфейс при помощи команды:
ifconfig -i
В дополнение к сетевым контроллерам и устройству loopback, должен появиться новый сетевой интерфейс:
ppp0 Link encap:Point-to-Point Protocol
inet addr:10.144.153.104 P-t-P:10.144.153.51 Mask:255.255.255.0
UP POINTOPOINT RUNNING MTU:552 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0
TX packets:0 errors:0 dropped:0 overruns:0
где:
- inet addr:10.144.153.10 -IP адрес Вашей стороны канала.
- P-t-P:10.144.153.51 -IP адрес Вашего сервера.
В действительности ifconfig выдаст другие адреса, те, которые использует Ваш конкретный сервер. Обратите внимание, что ifconfig сообщает о том, что канал UP - активен и RUNNING - работает!
Если Вы не видите нового сетевого устройства или видите что-либо подобное:
ppp0 Link encap:Point-Point Protocol
inet addr:0.0.0.0 P-t-P:0.0.0.0 Mask:0.0.0.0
POINTOPOINT MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0
TX packets:0 errors:0 dropped:0 overruns:0
то Вам не удалось установить РРР соединение.
Если все работает нормально, можно посмотреть таблицы маршрутизации при помощи команды:
route -n
Вы должны увидеть примерно следующее, но с другими IP адресами:
Kernel routing table
Destination Gateway Genmask Flags MSS Window Use Iface
10.144.153.3 * 255.255.255.255 UH 1500 0 1 ppp0
127.0.0.0 * 255.0.0.0 U 3584 0 11 lo
10.0.0.0 * 255.0.0.0 U 1500 0 35 eth0
default 10.144.153.3 * UG 1500 0 5 ppp0
Важно отметить, что мы видим два маршрута, связанные с РРР каналом. Первый - это маршрут хоста, помеченный флагом "H", он позволяет нам видеть компьютер, с которым мы соединены, но не дальше. Второй - маршрут по умолчанию (параметр defaultroute при запуске pppd) с флагом "G" - gateway. Этот маршрут предписывает передавать все пакеты, не предназначенные для локальной сети Etherhet (для которых существует свой собственный маршрут), непосредственно РРР серверу. Далее сервер пересылает наши пакеты в сеть Интернет и передает нам пакеты, адресованные нашей сети или компьютеру.
Если Вы не видите таблицы маршрутизации с двумя маршрутами для РРР, значит канал не работает. Например, если РРР устройство не "подхватило" маршрут по умолчанию, defaultroute, и этот маршрут по-прежнему принадлежит Ethernet адаптеру. МОЖЕТ СУЩЕСТВОВАТЬ ТОЛЬКО ОДИН МАРШРУТ ПО УМОЛЧАНИЮ!!! Проверьте системные файлы, поищите настройку маршрута defaultroute (она имеет вид команды: route add default..) Измените ее таким образом: route add net..
Теперь протестируем наш канал связи командой ping:
ping 195.50.0.161
На экране появится результат выполнения этой программы:
PING 195.50.0.161 (195.50.0.161): 56 data bytes
64 bytes from 195.50.0.161: icmp_seq=0 ttl=124 time=199.9 ms
64 bytes from 195.50.0.161: icmp_seq=1 ttl=124 time=198.8 ms
64 bytes from 195.50.0.161: icmp_seq=2 ttl=124 time=234.8 ms
64 bytes from 195.50.0.161: icmp_seq=3 ttl=124 time=184.4 ms
64 bytes from 195.50.0.161: icmp_seq=4 ttl=124 time=162.1 ms
64 bytes from 195.50.0.161: icmp_seq=5 ttl=124 time=175.2 ms
64 bytes from 195.50.0.161: icmp_seq=6 ttl=124 time=162.0 ms
Новые строки могут появляться вечно, поэтому Вы можете прервать выполнение программы, нажав знаменитую комбинацию клавиш . Программа отрапортует:
-- 195.50.0.161 ping statistics --7 packets transmitted, 7 packets received, 0% packet loss
round-trip min/avg/max = 162.0/188.1/234.8 ms
Замечательно! Все работает, поехали дальше. Теперь попробуем "пропинговать" удаленный компьютер, но не по его цифровому IP адресу, а по имени, причем не сервер Вашего провайдера, а любую другую машину:
ping sunsite.unc.edu
PING sunsite.unc.edu (152.2.254.81): 56 data bytes
64 bytes from 152.2.254.81: icmp_seq=0 ttl=242 time=1031.0 ms
64 bytes from 152.2.254.81: icmp_seq=1 ttl=242 time=1175.1 ms
64 bytes from 152.2.254.81: icmp_seq=2 ttl=242 time=1079.1 ms
64 bytes from 152.2.254.81: icmp_seq=3 ttl=242 time=1053.3 ms- sunsite.unc.edu ping statistics -6 packets transmitted, 4 packets received, 33% packet lossround-trip min/avg/max = 1031.0/1084.6/1175.1 ms
На этот раз Вы заметите небольшую задержку перед выполнением программы - Ваш компьютер должен успеть получить IP адрес хоста, к которому Вы обращаетесь, от своего DNS сервера, информация о котором находится в файле /etc/resolv.conf. Так что пусть Вас не беспокоит небольшая пауза, индикаторы модема должны мигать при приеме и передаче информации. Если Вы не получите ответа, проверьте таким же образом связь со своим DNS сервером, а заодно и содержимое файла /etc/resolv.conf.
Если все работает хорошо, можно отключить РРР соединение командой:
ppp-off
После короткой паузы модем должен отключиться. Если не сработает, можно отключить электропитание модема или, снова запустив коммуникационную программу, передать модему команды "+++" и "ATH0". Возможно, Вам понадобится удалить lock-файлы, созданные pppd при его работе:
rm -f /var/lock/LCK..ttySx
Автоматизируем процесс соединения
Как только мы успешно соединились с РРР сервером вручную, можно попробовать настроить программы для автоматического соединения. После этого любой пользователь из группы ррр или root сможет управлять каналом связи, выполняя необходииые команды.
Если программа РРР установлена корректно, то Вы можете найти несколько файлов-шаблонов программ для управления ррр. Для РРР версии 2.1.2 они находятся в каталоге /usr/sbin, а для РРР версии 2.2 - в каталоге /etc/ppp/scripts. Они называются:
- для РРР-2.1.2
ppp-on
ppp-off
- для РРР-2.2
ppp-on
ppp-on-dialer
ppp-off
Теперь, если Вы используете РРР версии 2.1.2, я настоятельно рекомендую удалить эти файлы. Это потенциальная возможность возникновения проблем в Вашей системе, и не нужно уверять меня, что они прекрасно работают. К Вашим услугам здесь новейшие версии этих файлов, которые работают лучше.
Скрипт ppp-on
Это первый скрипт, который устанавливает соединение.
#!/bin/sh
#
# Программа для запуска РРР соединения.Это первая часть
# программы
#
# Это параметры, которые необходимо изменить:
TELEPHONE=5555-555 # номер телефона провайдера
ACCOUNT=george # имя для подключения
PASSWORD=gracie # пароль для подключения
LOCAL_IP=0.0.0.0 # IP адрес, если известен, для
# динамических - 0.0.0.0
REMOTE_IP=0.0.0.0 # IP адрес сервера, если нужно,
# можно оставить 0.0.0.0
NETMASK=255.255.255.0 # соответствующая маска подсети
#
# Экспортируем их, чтобы они могли использоваться другими
# программами
EXPORT TELEPHONE ACCOUNT PASSWORD
#
# Это путь ко второй части скрипта, которая
# набирает телефонный номер и обеспечивает подключение.
# Пожалуйста, используйте полный путь к этому файлу
#
DIALER_SCRIPT=/etc/ppp/pp-on-dialer
#
# Запуск pppd
#
exec/usr/sbin/pppd debug /dev/ttySx 38400 \
$LOCAL_IP:$REMOTE_IP \
connect $DIALER_SCRIPT
Этот файл нужно отредактировать - вписать свое имя пользователя, под которым Вас зарегистрировал Ваш провайдер, пароль и номер телефона РРР сервера. Каждая строка в этом файле, например, "TELEPHONE=" присваивает соответствующее значение, указанное после знака равенства определенной переменной шелла (исключая строки комментария -#). Переменная DIALER_SCRIPT должна содержать полный путь и имя файла второй части скрипта. Если Вы перенесли этот файл в другой каталог или переименовали его, будьте внимательны при редактировании этой строки. А вот скрипт ppp-on-dialer:
#!/bin/sh
#
# Это вторая часть программы,
#
/usr/sbin/chat -v \
TIMEOUT 3 \
ABORT '\nBUSY\r' \
ABORT '\nNO ANSWER\r' \
ABORT '\nRINGING\r\n\r\nRINGING\r ' \
'' \rAT \
'OK-+++\c-OK' ATH0 \
TIMEOUT 30 \
OK ATDP$TELEPHONE \
CONNECT '' \
ogin:-ogin: $ACCOUNT \
assword: $PASSWORD
Эта программа как раз и устанавливает первоначальное соединение, его называют еще chat-script. Примечание: этот скрипт состоит из одной строки, а символы "\" позволяют разбить ее на несколько строк, удобных для просмотра и редактирования. Рассмотрим детально, что делает эта программа.
Chat скрипт - это последовательность "ожидаемых сообщений" и "отправляемых сообщений", которые сгруппированы попарно. Учтите, что мы ВСЕГДА ждем чего-либо перед тем, как отправить очередную строку. Если мы хотим послать данные, не дожидаясь запроса, мы используем "пустую строку" ожидания (''). Если строка содержит несколько слов, (например, NO CARRIER), мы должны взять ее в кавычки.
Прежде всего происходит вызов программы /usr/sbin/chat, ключ "-v" обеспечивает запись ВСЕГО ввода-вывода в системный лог-файл, обычно это файл /var/log/messages. Когда Ваш канал заработает нормально, удалите этот ключ "-v", чтобы не засорять этот файл лишними сообщениями.
Далее устанавливается параметр времени ожидания ввода информации в три секунды. Это значение можно увеличить до 5-10 секунд, если Вы используете медленный модем.
Следующие строки вызывают прекращение выполнения программы, в случаях если линия занята (BUSY), телефон не отвечает (NO ANSWER) или Ваш модем распознает входящий звонок (RINGING).
Если никакие катаклизмы в телефонной линии не обнаружены, то модему отправляется команда (AT). Она просто проверяет самочувствие этого устройства, с которым Вы связываете так много надежд.
Следующая строка программы говорит о том, что мы ожидаем ответа модема "ОК", но, в случае если модем находится в режиме передачи данных и не выдает ожидаемого ответа, отправляем ему команду перехода в режим команд "+++" (эта команда может применяться для всех Hayes - совместимых модемов) и снова ожидаем ответа модема "ОК" и даем ему команду "сброс" - ATH0.
Далее мы устанавливаем время ожидания в 30 секунд для отработки оставшейся части скрипта. Если Ваши модемы не успевают соединиться за это время, можно увеличить это значение до 45 секунд. Снова дожидаемся ответа модема "ОК" (это ответ на команду АТН0) и набираем номер телефона.
Ждем реакции модема "CONNECT", которая приходит после ответа вызываемого модема, и не отправляем модему никаких команд, но терпеливо дожидаемся приглашения на вход в систему "ogin:". Если до истечения времени ожидания ничего не приходит, отправляем символ "возврат каретки" и ждем дальше. Получив ожидаемое, посылаем в линию свое имя, которое хранит переменная $ACCOUNT. В ответ на приглашение ввести наш пароль (assword:) посылаем его (он хранится в переменной $PASSWORD). Если РРР сервер использует РАР/СНАР протокол для идентификации пользователей, ppp-on-dialer скрипт будет короче на две последние строки.
Этот ppp-on-dialer скрипт будет прекрасно работать с серверами, которые автоматически запускают ррр сразу после Вашего подключения. Но существуют сервера, при подключении к которым нужно запускать программу ррр вручную. В этом случае следует добавить еще одну, последнюю строку в скрипт:
user-user ppp
Здесь пара "user-user" заменяется Вашим пользовательским именем, а "ррр" - команда запуска ррр на сервере. Стандартная строка подсказки, которая выдается сервером после успешного подключения, должна содержать Ваше имя, под которым Вы зарегистрированы на сервере своего провайдера. Кроме него, эта строка может содержать и некоторые специальные символы (например "[", "]" или "$"), которые имеют особое значение для шелла, и использовать их в нашем скрипте не рекомендуется.
Напоминаю, что строку, предшествующую добавляемой нами последней строке, необходимо завершить символом "\", чтобы весь наш скрипт воспринимался как одна строка!
К сожалению, различные сервера могут по разному формировать "строку подсказки", которую мы ожидаем, поэтому следует обратить внимание на ее вид при тестировании ррр канала связи вручную.
Для PPP-2.2 скрипт ppp-off выглядит так:
#!/bin/sh
#
# Определение отключаемого устройства
#
if ["$1" = ""]; then
DEVICE=ppp0
else
DEVICE=$1
fi
#
# Если файл процесса pppсуществует, значит программа
# работает. Останавливаем ее.
if [ -r /var/run/$DEVICE.pid]; then
kill -INT 'cat /var/run/$DEVICE.pid'
# Если процесс с таким номером не существует, его убить
# невозможно. Это может означать, что сохранился lock
# файл, который нужно удалить.
if [ ! "$?" = "0" ]; then
rm -f /var/run/$DEVICE.pid
echo "ERROR: Removed stale pid file"
exit 1
fi
# Успешное завершение. pppd сам удалит свои рабочие
# файлы
echo "PPP link to $DEVICE terminated."
exit 0
fi
# Процесс ррр не активен на данном устройстве
echo "ERROR: PPP link is not active on $DEVICE
exit 1
Как мы уже знаем, можно запустить ррр в режиме отладки с ключом "-d" или включить параметр "debug" для того, чтобы получить полный протокол всех событий, происходящих на нашем канале связи и сохранить информацию, принимаемую и передаваемую модемом в специальном log-файле. Не забывайте, что этот файл будет расти очень быстро, и если на жестком диске имеется ограниченное свободное пространство, существует возможность сведения этого свободного пространства к нулю. Как только мы с радостью убедимся, что все работает нормально, режим отладки можно отключить.
Игорь Грень, gren@isir.minsk.by - титульная страница
Окончание. Начало в N№ 35, 36
Устанавливаем РРР соединение вручную
Теперь, когда мы создали файлы /etc/ppp/options и /etc/resolv.conf, а также, в случае необходимости, /etc/ppp/pap(chap)-secrets, мы можем проверить правильность настроек этих файлов, установив РРР соединение со своим сервером вручную. Как только мы убедимся, что все работает, мы автоматизируем этот процесс. Для того чтобы сделать это, Ваша коммуникационная программа должна иметь возможность завершения работы без изменения режима работы модема. Minicom может делать это при нажатии комбинации клавиш
Войдите в свою систему как пользователь root.
Запустите коммуникационную программу (например, minicom), наберите номер телефона сервера своего провайдера. Войдите в систему ( login). Если нужно выполнить команду запуска РРР на сервере, выполните ее. На Вашем экране должен появиться "мусор". Если Ваш сервер использует протоколы PAP или CHAP, удаленная система сама запустит РРР и Вы увидите "мусор" на своем экране до входа в систему. Некоторые сервера ждут нажатия клавиши
Теперь выйдите из коммуникационной программы без сброса модема и введите следующую команду:
pppd -d -detach /dev/ttySx 38400 &
Ключ -d включает режим отладки, вся информация, проходящая через последовательный порт, будет сохраняться в log-файле. Это может оказаться полезным, если Вы столкнетесь с проблемами.
Световые индикаторы на модеме (внешнем, разумеется) должны мигнуть, и вскоре РРР-соединение будет установлено. Теперь можно посмотреть на Ваш РРР интерфейс при помощи команды:
ifconfig -i
В дополнение к сетевым контроллерам и устройству loopback, должен появиться новый сетевой интерфейс:
ppp0 Link encap:Point-to-Point Protocol
inet addr:10.144.153.104 P-t-P:10.144.153.51 Mask:255.255.255.0
UP POINTOPOINT RUNNING MTU:552 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0
TX packets:0 errors:0 dropped:0 overruns:0
где:
- inet addr:10.144.153.10 -IP адрес Вашей стороны канала.
- P-t-P:10.144.153.51 -IP адрес Вашего сервера.
В действительности ifconfig выдаст другие адреса, те, которые использует Ваш конкретный сервер. Обратите внимание, что ifconfig сообщает о том, что канал UP - активен и RUNNING - работает!
Если Вы не видите нового сетевого устройства или видите что-либо подобное:
ppp0 Link encap:Point-Point Protocol
inet addr:0.0.0.0 P-t-P:0.0.0.0 Mask:0.0.0.0
POINTOPOINT MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0
TX packets:0 errors:0 dropped:0 overruns:0
то Вам не удалось установить РРР соединение.
Если все работает нормально, можно посмотреть таблицы маршрутизации при помощи команды:
route -n
Вы должны увидеть примерно следующее, но с другими IP адресами:
Kernel routing table
Destination Gateway Genmask Flags MSS Window Use Iface
10.144.153.3 * 255.255.255.255 UH 1500 0 1 ppp0
127.0.0.0 * 255.0.0.0 U 3584 0 11 lo
10.0.0.0 * 255.0.0.0 U 1500 0 35 eth0
default 10.144.153.3 * UG 1500 0 5 ppp0
Важно отметить, что мы видим два маршрута, связанные с РРР каналом. Первый - это маршрут хоста, помеченный флагом "H", он позволяет нам видеть компьютер, с которым мы соединены, но не дальше. Второй - маршрут по умолчанию (параметр defaultroute при запуске pppd) с флагом "G" - gateway. Этот маршрут предписывает передавать все пакеты, не предназначенные для локальной сети Etherhet (для которых существует свой собственный маршрут), непосредственно РРР серверу. Далее сервер пересылает наши пакеты в сеть Интернет и передает нам пакеты, адресованные нашей сети или компьютеру.
Если Вы не видите таблицы маршрутизации с двумя маршрутами для РРР, значит канал не работает. Например, если РРР устройство не "подхватило" маршрут по умолчанию, defaultroute, и этот маршрут по-прежнему принадлежит Ethernet адаптеру. МОЖЕТ СУЩЕСТВОВАТЬ ТОЛЬКО ОДИН МАРШРУТ ПО УМОЛЧАНИЮ!!! Проверьте системные файлы, поищите настройку маршрута defaultroute (она имеет вид команды: route add default..) Измените ее таким образом: route add net..
Теперь протестируем наш канал связи командой ping:
ping 195.50.0.161
На экране появится результат выполнения этой программы:
PING 195.50.0.161 (195.50.0.161): 56 data bytes
64 bytes from 195.50.0.161: icmp_seq=0 ttl=124 time=199.9 ms
64 bytes from 195.50.0.161: icmp_seq=1 ttl=124 time=198.8 ms
64 bytes from 195.50.0.161: icmp_seq=2 ttl=124 time=234.8 ms
64 bytes from 195.50.0.161: icmp_seq=3 ttl=124 time=184.4 ms
64 bytes from 195.50.0.161: icmp_seq=4 ttl=124 time=162.1 ms
64 bytes from 195.50.0.161: icmp_seq=5 ttl=124 time=175.2 ms
64 bytes from 195.50.0.161: icmp_seq=6 ttl=124 time=162.0 ms
Новые строки могут появляться вечно, поэтому Вы можете прервать выполнение программы, нажав знаменитую комбинацию клавиш
-- 195.50.0.161 ping statistics --7 packets transmitted, 7 packets received, 0% packet loss
round-trip min/avg/max = 162.0/188.1/234.8 ms
Замечательно! Все работает, поехали дальше. Теперь попробуем "пропинговать" удаленный компьютер, но не по его цифровому IP адресу, а по имени, причем не сервер Вашего провайдера, а любую другую машину:
ping sunsite.unc.edu
PING sunsite.unc.edu (152.2.254.81): 56 data bytes
64 bytes from 152.2.254.81: icmp_seq=0 ttl=242 time=1031.0 ms
64 bytes from 152.2.254.81: icmp_seq=1 ttl=242 time=1175.1 ms
64 bytes from 152.2.254.81: icmp_seq=2 ttl=242 time=1079.1 ms
64 bytes from 152.2.254.81: icmp_seq=3 ttl=242 time=1053.3 ms- sunsite.unc.edu ping statistics -6 packets transmitted, 4 packets received, 33% packet lossround-trip min/avg/max = 1031.0/1084.6/1175.1 ms
На этот раз Вы заметите небольшую задержку перед выполнением программы - Ваш компьютер должен успеть получить IP адрес хоста, к которому Вы обращаетесь, от своего DNS сервера, информация о котором находится в файле /etc/resolv.conf. Так что пусть Вас не беспокоит небольшая пауза, индикаторы модема должны мигать при приеме и передаче информации. Если Вы не получите ответа, проверьте таким же образом связь со своим DNS сервером, а заодно и содержимое файла /etc/resolv.conf.
Если все работает хорошо, можно отключить РРР соединение командой:
ppp-off
После короткой паузы модем должен отключиться. Если не сработает, можно отключить электропитание модема или, снова запустив коммуникационную программу, передать модему команды "+++" и "ATH0". Возможно, Вам понадобится удалить lock-файлы, созданные pppd при его работе:
rm -f /var/lock/LCK..ttySx
Автоматизируем процесс соединения
Как только мы успешно соединились с РРР сервером вручную, можно попробовать настроить программы для автоматического соединения. После этого любой пользователь из группы ррр или root сможет управлять каналом связи, выполняя необходииые команды.
Если программа РРР установлена корректно, то Вы можете найти несколько файлов-шаблонов программ для управления ррр. Для РРР версии 2.1.2 они находятся в каталоге /usr/sbin, а для РРР версии 2.2 - в каталоге /etc/ppp/scripts. Они называются:
- для РРР-2.1.2
ppp-on
ppp-off
- для РРР-2.2
ppp-on
ppp-on-dialer
ppp-off
Теперь, если Вы используете РРР версии 2.1.2, я настоятельно рекомендую удалить эти файлы. Это потенциальная возможность возникновения проблем в Вашей системе, и не нужно уверять меня, что они прекрасно работают. К Вашим услугам здесь новейшие версии этих файлов, которые работают лучше.
Скрипт ppp-on
Это первый скрипт, который устанавливает соединение.
#!/bin/sh
#
# Программа для запуска РРР соединения.Это первая часть
# программы
#
# Это параметры, которые необходимо изменить:
TELEPHONE=5555-555 # номер телефона провайдера
ACCOUNT=george # имя для подключения
PASSWORD=gracie # пароль для подключения
LOCAL_IP=0.0.0.0 # IP адрес, если известен, для
# динамических - 0.0.0.0
REMOTE_IP=0.0.0.0 # IP адрес сервера, если нужно,
# можно оставить 0.0.0.0
NETMASK=255.255.255.0 # соответствующая маска подсети
#
# Экспортируем их, чтобы они могли использоваться другими
# программами
EXPORT TELEPHONE ACCOUNT PASSWORD
#
# Это путь ко второй части скрипта, которая
# набирает телефонный номер и обеспечивает подключение.
# Пожалуйста, используйте полный путь к этому файлу
#
DIALER_SCRIPT=/etc/ppp/pp-on-dialer
#
# Запуск pppd
#
exec/usr/sbin/pppd debug /dev/ttySx 38400 \
$LOCAL_IP:$REMOTE_IP \
connect $DIALER_SCRIPT
Этот файл нужно отредактировать - вписать свое имя пользователя, под которым Вас зарегистрировал Ваш провайдер, пароль и номер телефона РРР сервера. Каждая строка в этом файле, например, "TELEPHONE=" присваивает соответствующее значение, указанное после знака равенства определенной переменной шелла (исключая строки комментария -#). Переменная DIALER_SCRIPT должна содержать полный путь и имя файла второй части скрипта. Если Вы перенесли этот файл в другой каталог или переименовали его, будьте внимательны при редактировании этой строки. А вот скрипт ppp-on-dialer:
#!/bin/sh
#
# Это вторая часть программы,
#
/usr/sbin/chat -v \
TIMEOUT 3 \
ABORT '\nBUSY\r' \
ABORT '\nNO ANSWER\r' \
ABORT '\nRINGING\r\n\r\nRINGING\r ' \
'' \rAT \
'OK-+++\c-OK' ATH0 \
TIMEOUT 30 \
OK ATDP$TELEPHONE \
CONNECT '' \
ogin:-ogin: $ACCOUNT \
assword: $PASSWORD
Эта программа как раз и устанавливает первоначальное соединение, его называют еще chat-script. Примечание: этот скрипт состоит из одной строки, а символы "\" позволяют разбить ее на несколько строк, удобных для просмотра и редактирования. Рассмотрим детально, что делает эта программа.
Chat скрипт - это последовательность "ожидаемых сообщений" и "отправляемых сообщений", которые сгруппированы попарно. Учтите, что мы ВСЕГДА ждем чего-либо перед тем, как отправить очередную строку. Если мы хотим послать данные, не дожидаясь запроса, мы используем "пустую строку" ожидания (''). Если строка содержит несколько слов, (например, NO CARRIER), мы должны взять ее в кавычки.
Прежде всего происходит вызов программы /usr/sbin/chat, ключ "-v" обеспечивает запись ВСЕГО ввода-вывода в системный лог-файл, обычно это файл /var/log/messages. Когда Ваш канал заработает нормально, удалите этот ключ "-v", чтобы не засорять этот файл лишними сообщениями.
Далее устанавливается параметр времени ожидания ввода информации в три секунды. Это значение можно увеличить до 5-10 секунд, если Вы используете медленный модем.
Следующие строки вызывают прекращение выполнения программы, в случаях если линия занята (BUSY), телефон не отвечает (NO ANSWER) или Ваш модем распознает входящий звонок (RINGING).
Если никакие катаклизмы в телефонной линии не обнаружены, то модему отправляется команда (AT). Она просто проверяет самочувствие этого устройства, с которым Вы связываете так много надежд.
Следующая строка программы говорит о том, что мы ожидаем ответа модема "ОК", но, в случае если модем находится в режиме передачи данных и не выдает ожидаемого ответа, отправляем ему команду перехода в режим команд "+++" (эта команда может применяться для всех Hayes - совместимых модемов) и снова ожидаем ответа модема "ОК" и даем ему команду "сброс" - ATH0.
Далее мы устанавливаем время ожидания в 30 секунд для отработки оставшейся части скрипта. Если Ваши модемы не успевают соединиться за это время, можно увеличить это значение до 45 секунд. Снова дожидаемся ответа модема "ОК" (это ответ на команду АТН0) и набираем номер телефона.
Ждем реакции модема "CONNECT", которая приходит после ответа вызываемого модема, и не отправляем модему никаких команд, но терпеливо дожидаемся приглашения на вход в систему "ogin:". Если до истечения времени ожидания ничего не приходит, отправляем символ "возврат каретки" и ждем дальше. Получив ожидаемое, посылаем в линию свое имя, которое хранит переменная $ACCOUNT. В ответ на приглашение ввести наш пароль (assword:) посылаем его (он хранится в переменной $PASSWORD). Если РРР сервер использует РАР/СНАР протокол для идентификации пользователей, ppp-on-dialer скрипт будет короче на две последние строки.
Этот ppp-on-dialer скрипт будет прекрасно работать с серверами, которые автоматически запускают ррр сразу после Вашего подключения. Но существуют сервера, при подключении к которым нужно запускать программу ррр вручную. В этом случае следует добавить еще одну, последнюю строку в скрипт:
user-user ppp
Здесь пара "user-user" заменяется Вашим пользовательским именем, а "ррр" - команда запуска ррр на сервере. Стандартная строка подсказки, которая выдается сервером после успешного подключения, должна содержать Ваше имя, под которым Вы зарегистрированы на сервере своего провайдера. Кроме него, эта строка может содержать и некоторые специальные символы (например "[", "]" или "$"), которые имеют особое значение для шелла, и использовать их в нашем скрипте не рекомендуется.
Напоминаю, что строку, предшествующую добавляемой нами последней строке, необходимо завершить символом "\", чтобы весь наш скрипт воспринимался как одна строка!
К сожалению, различные сервера могут по разному формировать "строку подсказки", которую мы ожидаем, поэтому следует обратить внимание на ее вид при тестировании ррр канала связи вручную.
Для PPP-2.2 скрипт ppp-off выглядит так:
#!/bin/sh
#
# Определение отключаемого устройства
#
if ["$1" = ""]; then
DEVICE=ppp0
else
DEVICE=$1
fi
#
# Если файл процесса pppсуществует, значит программа
# работает. Останавливаем ее.
if [ -r /var/run/$DEVICE.pid]; then
kill -INT 'cat /var/run/$DEVICE.pid'
# Если процесс с таким номером не существует, его убить
# невозможно. Это может означать, что сохранился lock
# файл, который нужно удалить.
if [ ! "$?" = "0" ]; then
rm -f /var/run/$DEVICE.pid
echo "ERROR: Removed stale pid file"
exit 1
fi
# Успешное завершение. pppd сам удалит свои рабочие
# файлы
echo "PPP link to $DEVICE terminated."
exit 0
fi
# Процесс ррр не активен на данном устройстве
echo "ERROR: PPP link is not active on $DEVICE
exit 1
Как мы уже знаем, можно запустить ррр в режиме отладки с ключом "-d" или включить параметр "debug" для того, чтобы получить полный протокол всех событий, происходящих на нашем канале связи и сохранить информацию, принимаемую и передаваемую модемом в специальном log-файле. Не забывайте, что этот файл будет расти очень быстро, и если на жестком диске имеется ограниченное свободное пространство, существует возможность сведения этого свободного пространства к нулю. Как только мы с радостью убедимся, что все работает нормально, режим отладки можно отключить.
Игорь Грень, gren@isir.minsk.by - титульная страница
Компьютерная газета. Статья была опубликована в номере 38 за 1998 год в рубрике soft :: unix