Использование 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.

Простой скрипт

Допустим, Вы написали скрипт для связи через 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 . Вы можете получить краткий обзор всех команд, вызывая 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 служит как помощь в отладке. Использование echo on просит dip пересылать копию диалога с последовательным устройством на консоль. Эхо можно выключить командой echo off.

dipтакже позволяет Вам временно выключить режим скрипта и выйти в режим терминала. В этом режиме Вы можете использовать dip точно так же, как и обычную программу-терминал, пишущую в последовательную линию и читающую из нее. Чтобы выйти из этого режима, введите Ctrl-].

Команда get

Команда 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

Команда print

Отображает текст на консоли из 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 и goto

Команда if полноценная команда if, без которой нет ни одного языка программирования. Ее синтаксис:

if var op number goto label

где выражение должно быть простым сравнением с одной из переменных $errlvl, $locip и$rmtip. 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-связи.