Библиотека сайта rus-linux.net
Linux Network Administrators Guide | ||
---|---|---|
Назад | Глава 7. Serial Line IP | Вперед |
Использование dip
Хотелось бы иметь простую команду, которая выполняет все необходимые для установки связи действия: открывает последовательное устройство, дозванивается по модему до провайдера, регистрируется, запускает протокол SLIP и настраивает сетевой интерфейс. Такая команда есть и называется dip.
dip это сокращение от
Dialup IP. Она написана Fred van Kempen, и исправлена
большим количеством людей. На сегодняшний день с большинством дистрибутивов
Linux поставляется версия dip337p-uri
, которая также
доступна на FTP-архиве metalab.unc.edu.
dip обеспечивает интерпретатор простого языка, который обрабатывает модем, переводя линию в SLIP-режим и конфигурируя сеть. Этот язык довольно примитивен и ограничен, но вполне подходит для большинства случаев.
Чтобы сконфигурировать SLIP-интерфейс, dip требует привелегий root. Соблазнительно сделать dip setuid к root, чтобы Все пользователи могли соединиться с некоторым сервером SLIP без необходимости предоставления им root-доступа. Это очень опасно, потому что при установке фиктивных интерфейсов и заданных по умолчанию маршрутов dip может разрушить маршрутизацию в Вашей сети. Даже еще хуже, это даст пользователям приоритет на подсоединение к любым SLIP-серверам и начать атаку на Вашу сеть. Так, если Вы хотите позволить Вашим пользователям запустить SLIP-связь, напишите маленькие программки для каждого предполагаемого SLIP-сервера и вызовите dip с соответствующим скриптом, который установит связь. Эти программы могут быть безопасно сделаны setuid root. В качестве альтерантивы предлагается команда sudo.
Простой скрипт
cowslip.dip
. Теперь запустите
dip и передайте ему имя скрипта как аргумент командной строки:
#
|
Сам скрипт показан в примере 7-1 .
Пример 7-1. Простой скрипт для dip
# Sample dip script for dialing up cowslip # Set local and remote name and address get $local vlager-slip get $remote cowslip port ttyS3 # choose a serial port speed 38400 # set speed to max modem HAYES # set modem type reset # reset modem and tty flush # flush out modem response # Prepare for dialing. send ATQ0V1E1X1\r wait OK 2 if $errlvl != 0 goto error dial 41988 if $errlvl != 0 goto error wait CONNECT 60 if $errlvl != 0 goto error # Okay, we're connected now sleep 3 send \r\n\r\n wait ogin: 10 if $errlvl != 0 goto error send Svlager\n wait ssword: 5 if $errlvl != 0 goto error send knockknock\n wait running 30 if $errlvl != 0 goto error # We have logged in, and the remote side is firing up SLIP. print Connected to $remote with address $rmtip default # Make this link our default route mode SLIP # We go to SLIP mode, too # fall through in case of error error: print SLIP to $remote failed. |
-k
. Это пошлет сигнал hangup процессу
dip, используя запись id dip в
/etc/dip.pid
:
#
|
В языке скриптов dip, ключевые слова с префиксом $ обозначают различные имена. dip имеет предопределенное множество переменных, которые будут перечислены ниже. Например, $remote и $local содержат имена удаленной и локальной машин.
Первые два оператора в типовом скрипте команды get, которые являются способом установки переменных в dip. Здесь имена локальной и удаленной машин установлены соответственно в vlager и cowslip .
Следующие пять операторов устанавливают линию терминала и модем. Команда reset посылает reset-строку модему (для Hayes-совместимых модемов, это ATZ). Следующий оператор игнорирует реакцию модема так, чтобы login chat на последовательных линиях работал правильно. Сhat довольно прост: он набирает номер 41988, номер телефона cowslip, и подсоединяется под именем Svlager через пароль knockknock. Команда wait заставит dip ждать строку, заданную как его первый аргумент. Число, заданное в секундах, как второй аргумент, определяет, сколько времени надо ждать, если строка не была получена. Команды if разбросаны в процедуре входа в систему и проверяют то, что никакие ошибки не появились при выполнении этой команды.
Итоговые (final) команды выполняются после регистрации. Они заданы в default, и заставят SLIP связать заданный по умолчанию маршрут со всеми хостами и режимом (mode ), который включает SLIP на линии и конфигурирует интерфейс и таблицу маршрутов (routing tables).
Команды dip
В этом разделе мы рассмотрим команды языка скриптов dip . Вы можете получить краткий обзор всех команд, вызывая dip в тестовом режиме и вводя команду help. Для того, чтобы выяснить синтаксис конкрентой команды, Вы можете набрать команду без каких-либо аргументов; увы, это не сработает с командами, которым не нужны аргументы. Ниже показано действие команды help:
# |
Во всех примерах, в которых есть приглашение DIP>, имеется в виду ввод команды в тестовом режиме. Примеры, в которых такого приглашения нет, показывают скрипты.
Команды модема
dip имеет ряд команд для настройки последовательной линии и модема. Некоторые из них очевидны, например, port выбирает последовательный порт, speed, databits , stopbits и parity, которые задают соответствующие параметры линии. Команда modem задает тип модема. Пока поддерживается только HAYES (именно БОЛЬШИМИ буквами!). Вы должны сообщить dip тип модема, иначе он не будет выполнять команды dial и reset. Команда reset посылает в модем строку рестарта. Для Hayes-совместимых модемов это ATZ.
Код flush может использоваться для того, чтобы убрать все реакции, которые модем посылает в ответ на команды. Иначе скрипт после reset может запутаться потому, что он читает OK реакции на более ранние команды модема.
Команда init посылает в модем строку инициализации перед дозвоном. Для Hayes-модемов это обычно "ATE0Q0V1X1".
Команда dial звонит на удаленную машину. Для Hayes-модемов это обычно ATD.
Команда echo
Команда echo служит как помощь в отладке. Использование echo on просит dip пересылать копию диалога с последовательным устройством на консоль. Эхо можно выключить командой echo off.
dipтакже позволяет Вам временно выключить режим скрипта и выйти в режим терминала. В этом режиме Вы можете использовать dip точно так же, как и обычную программу-терминал, пишущую в последовательную линию и читающую из нее. Чтобы выйти из этого режима, введите Ctrl-].
Команда get
DIP>
|
Your address: 192.168.5.74
",
то следующий фрагмент кода dip его примет в Вашей
системе:
# finish login wait address: 10 get $locip remote |
Команда print
DIP>
|
Имена переменных
dip понимает только предопределенное множество переменных. Имя переменной всегда начинается с символа доллара и должно быть написано в нижнем регистре.
Переменные $local и $locip хранят имя и IP-адрес локальной машины. При сохранении в $local канонического имени, dip автоматически преобразует его в IP-адрес и запишет результат в переменную $locip. То же самое, но в обратном порядке произойдет при записи в $locip : dip получит имя для этого адреса и запишет его в переменную $local.
Переменные $remote и $rmtip делают то же самое для удаленной машины. $mtu хранит значение MTU для связи.
Эти пять переменных единственые, которые могут быть заданы непосредственно, используя команду get. Другие переменные могут быть установлены только через соответствующие команды, но можно использовать и операторы print ; это $modem, $port и $speed .
$errlvl переменная, через которую Вы можете обращаться к результату последней выполненой команды. Уровень ошибки 0 указывает на успех, в то время, как ненулевое значение, обозначает ошибку.
Команды if и goto
if
|
var
должен быть целым числом; оператор op
может быть одним из ==
,
!=
, <
,
>
, <=
и
>=
.
Команда goto передает управление на строку
с меткой label
. Метка должна быть первым
словом в строке и оканчиваться двоеточием.
send, wait и sleep
Эти команды выполняют простые встроенные скрипты в dip . send выводит свои аргументы в последовательную линию. Он не поддерживает переменные, но понимает все C-подобные символы со слэшем, типа \n для новой строки и \b для стирания предыдущего символа. Знак тильды (~) используется как сокращение для возврата каретки с переводом строки.
Команда wait принимает слово в качестве аргумента и читает весь вход с последовательной линии до его появления. Слово не может содержать пробелов. Вы можете дать wait ограничение по времени как второй аргумент. Если ожидаемое слово не будет получено в течении заданного времени, команда завершится со значением $errlvl равным 1.
Команда sleep ожидает заданное время. Интервал задается в секундах.
mode и default
Эти команды нужны для того, чтобы переключить последовательную линию в SLIP-режим и сконфигурировать интерфейс.
Команда mode является последней выполняемой dip перед переходом в режим демона. Она ничего не возвращает до появления ошибки.
mode принимает как аргумент имя протокола. dip сейчас распознает SLIP , CSLIP, SLIP6, CSLIP6, PPP и TERM как имена протоколов. Текущая версия dip не понимает adaptive SLIP.
После запуска на последовательной линии режима SLIP dip выполняет ifconfig для настройки интерфейса и вызывает route для установки маршрутизации на удаленную машину.
Если скрипт выполняет команду default перед командой mode, dip создает маршрут по умолчанию для SLIP-связи.
Назад | Глобальное оглавление | Вперед |
Работа с внутренними IP-сетями | Локальное оглавление | Запуск в режиме сервера |