Хотелось бы иметь простую команду, которая выполняет все необходимые для установки связи действия: открывает последовательное устройство, дозванивается по модему до провайдера, регистрируется, запускает протокол 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.
Допустим, Вы написали скрипт для связи через dip с машиной cowslip и назвали его cowslip.dip. Теперь запустите dip и передайте ему имя скрипта как аргумент командной строки:
# dip cowslip.dip DIP: Dialup IP Protocol Driver version 3.3.7 (12/13/93) Written by Fred N. van Kempen, MicroWalt Corporation. connected to cowslip.moo.com with addr 192.168.5.74 # |
Сам скрипт показан в примере 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. |
После установления связи с cowslip и запуска протокола SLIP dip отсоединится от терминала и перейдет в фоновый режим. Вы сможете использовать обычные сетевые услуги на SLIP-связи. Чтобы завершить связь, просто вызовите dip c опцией -k. Это пошлет сигнал hangup процессу dip, используя запись id dip в /etc/dip.pid:
# dip -k |
В языке скриптов 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 в тестовом режиме и вводя команду help. Для того, чтобы выяснить синтаксис конкрентой команды, Вы можете набрать команду без каких-либо аргументов; увы, это не сработает с командами, которым не нужны аргументы. Ниже показано действие команды help:
# dip -t DIP: Dialup IP Protocol Driver version 3.3.7p-uri (25 Dec 96) Written by Fred N. van Kempen, MicroWalt Corporation. Debian version 3.3.7p-2 (debian). DIP> help DIP knows about the following commands: beep bootp break chatkey config databits dec default dial echo flush get goto help if inc init mode modem netmask onexit parity password proxyarp print psend port quit reset securidfixed securid send shell skey sleep speed stopbits term timeout wait DIP> echo Usage: echo on|off DIP> |
Во всех примерах, в которых есть приглашение 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 on просит dip пересылать копию диалога с последовательным устройством на консоль. Эхо можно выключить командой echo off.
dipтакже позволяет Вам временно выключить режим скрипта и выйти в режим терминала. В этом режиме Вы можете использовать dip точно так же, как и обычную программу-терминал, пишущую в последовательную линию и читающую из нее. Чтобы выйти из этого режима, введите Ctrl-].
Команда get представляет собой способ установки переменных в dip. Самая простая форма: установить переменную как константу, как это делалось в вышеупомянутом примере. Вы можете также спросить значение у пользователя, определяя ключевое слово ask вместо значения:
DIP> get $local ask Enter the value for $local: |
Третий метод состоит в том, чтобы попробовать получить значение с удаленного хоста. Причудливо на первый взгляд, но это очень полезно в некоторых случаях: некоторые серверы-SLIP не позволяют Вам использовать Ваш собственный IP-адрес на SLIP-связи, а будут приписывать Вам один из своих адресов всякий раз, когда Вы набираете номер, печатая сообщение, которое информирует Вас относительно адреса, который был назначен. Если есть сообщение вроде "Your address: 192.168.5.74", то следующий фрагмент кода dip его примет в Вашей системе:
# finish login wait address: 10 get $locip remote |
Отображает текст на консоли из dip. Любые переменные dip могут быть использованы в таких командах. Например:
DIP> print Using port $port at speed $speed Using port ttyS3 at speed 38400 |
dip понимает только предопределенное множество переменных. Имя переменной всегда начинается с символа доллара и должно быть написано в нижнем регистре.
Переменные $local и $locip хранят имя и IP-адрес локальной машины. При сохранении в $local канонического имени, dip автоматически преобразует его в IP-адрес и запишет результат в переменную $locip. То же самое, но в обратном порядке произойдет при записи в $locip : dip получит имя для этого адреса и запишет его в переменную $local.
Переменные $remote и $rmtip делают то же самое для удаленной машины. $mtu хранит значение MTU для связи.
Эти пять переменных единственые, которые могут быть заданы непосредственно, используя команду get. Другие переменные могут быть установлены только через соответствующие команды, но можно использовать и операторы print ; это $modem, $port и $speed .
$errlvl переменная, через которую Вы можете обращаться к результату последней выполненой команды. Уровень ошибки 0 указывает на успех, в то время, как ненулевое значение, обозначает ошибку.
Команда if полноценная команда if, без которой нет ни одного языка программирования. Ее синтаксис:
if var op number goto label |
Команда goto передает управление на строку с меткой label. Метка должна быть первым словом в строке и оканчиваться двоеточием.
Эти команды выполняют простые встроенные скрипты в dip . send выводит свои аргументы в последовательную линию. Он не поддерживает переменные, но понимает все C-подобные символы со слэшем, типа \n для новой строки и \b для стирания предыдущего символа. Знак тильды (~) используется как сокращение для возврата каретки с переводом строки.
Команда wait принимает слово в качестве аргумента и читает весь вход с последовательной линии до его появления. Слово не может содержать пробелов. Вы можете дать wait ограничение по времени как второй аргумент. Если ожидаемое слово не будет получено в течении заданного времени, команда завершится со значением $errlvl равным 1.
Команда sleep ожидает заданное время. Интервал задается в секундах.
Эти команды нужны для того, чтобы переключить последовательную линию в SLIP-режим и сконфигурировать интерфейс.
Команда mode является последней выполняемой dip перед переходом в режим демона. Она ничего не возвращает до появления ошибки.
mode принимает как аргумент имя протокола. dip сейчас распознает SLIP , CSLIP, SLIP6, CSLIP6, PPP и TERM как имена протоколов. Текущая версия dip не понимает adaptive SLIP.
После запуска на последовательной линии режима SLIP dip выполняет ifconfig для настройки интерфейса и вызывает route для установки маршрутизации на удаленную машину.
Если скрипт выполняет команду default перед командой mode, dip создает маршрут по умолчанию для SLIP-связи.
Назад | Глобальное оглавление | Вперед |
Работа с внутренними IP-сетями | Локальное оглавление | Запуск в режиме сервера |