Использование dip

Теперь всё просто. Однако, вы, возможно, захотите автоматизировать описанные выше шаги так, чтобы достаточно было бы выполнить одну команду, включающую все перечисленные операции. Для этого и предназначена программа dip. Текущая версия программы — 3.3.7.

Её разработкой занималось несколько разработчиков, и теперь сложно говорить о dip как о едином продукте. Разные версии программы в будущем, возможно, будут объединены в одну.

Dip предоставляет интерпретатор с простым языком, который настраивает модем для вас, переводит линию в режим SLIP и конфигурирует интерфейс. Данная версия, хоть и имеет ограниченные возможности, подходит для большинства задач. В новой версии dip планируется добавить поддержку многих других языков. Для настройки SLIP-интерфейса dip требует прав root. Может показаться привлекательной идеей сделать dip исполняемым с правами root, чтобы все пользователи могли подключаться к SLIP-серверу без предоставления им прав root. Но это может быть опасно, так как при настройке виртуальных интерфейсов и маршрутов по умолчанию dip может нарушить сетевую конфигурацию. Если вы хотите разрешить пользователям запускать SLIP-соединение, создайте отдельные программы для каждого потенциального SLIP-сервера, которые будут вызывать dip с определённым скриптом для установки соединения. Эти программы можно безопасно сделать исполняемыми с правами root.

Типовой скрипт dip

Он может использоваться для соединения с cowslip, вызывая dip со скриптом как аргументом:

Dip — это сокращение от Dialup IP. Эта программа была написана Fred'ом van Kempen.

# Пример скрипта dip для подключения к cowslip
# Задаем локальное и удаленное имя и адрес
get $local vlager
get $remote cowslip
port cua3                # выбираем последовательный порт
speed 38400              # устанавливаем максимальную скорость
modem HAYES              # указываем тип модема
reset                    # сбрасываем модем и tty
flush                    # очищаем ответ модема
# Подготавливаемся к звонку
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
# Мы подключились
sleep 3
send \r\n\r\n
wait login: 10
if $errlvl != 0 goto error
send Svlager\n
wait password: 5
if $errlvl != 0 goto error
send hey-jude\n
wait running 30
if $errlvl != 0 goto error
# Мы успешно вошли, и удаленная сторона начинает работу с SLIP
print "Подключено к $remote с адресом $rmtip"
default                  # делаем это подключение основным
route
mode SLIP                # переключаемся в режим SLIP
# Если возникла ошибка
error:
print "SLIP-соединение с $remote не удалось"

Чтобы выполнить этот скрипт, используйте команду:

# 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 193.174.7.129

После установления соединения с cowslip и включения режима SLIP, dip отключается от терминала и продолжает обеспечивать работу SLIP-соединения. Вы сможете использовать все стандартные сетевые сервисы по этому соединению. Для завершения соединения просто вызовите dip с опцией -k. Это отправит сигнал завершения dip-процессу, используя идентификатор записи dip в /etc/dip.pid.

# kill -k

На языке dip script ключевые слова с префиксом, начинающимся с символа $, обозначают различные переменные. В dip есть предопределенное множество переменных, которые будут перечислены ниже. $remote и $local, например, содержат имена хостов локальной машины и удаленного хоста, участвующих в SLIP-соединении.

Первые два оператора в типичном скрипте - это команды get, которые используются для установки переменных в dip. Здесь локальное и удаленное имена хостов устанавливаются как vlager и cowslip соответственно.

Следующие пять операторов настраивают терминальную линию и модем. Команда reset отправляет строку сброса модему; для модемов, совместимых с Hayes, это команда ATZ. Следующий оператор игнорирует ответ модема, чтобы вход в систему прошел корректно. Chat прост: он набирает номер 41988 - номер телефона cowslip, и подключается к аккаунту Svlager с паролем hey-jude. Команда wait заставляет dip ожидать строку, указанную как его первый аргумент; число, указанное как второй аргумент, устанавливает время ожидания, если строка не была получена. Команды if, разбросанные по процедуре входа, проверяют наличие ошибок при выполнении предыдущих команд.

Последние команды, выполненные после входа в систему, устанавливают значения по умолчанию, которые делают SLIP-соединение основным, и переключают режим на SLIP на линии, конфигурируя интерфейс и таблицы маршрутизации для вас.

Dip ссылка

Хотя dip широко используется, его документация до сих пор оставляет желать лучшего. Поэтому в этом разделе мы предоставляем ссылку на большинство команд dip. Вы можете получить краткий обзор всех команд, запустив dip в тестовом режиме и введя команду help. Чтобы узнать о синтаксисе определенной команды, вы можете ввести ее без аргументов, хотя это не работает для команд, которые не требуют аргументов.

$ dip -t
DIP: Dialup IP Protocol Driver version 3.3.7 (12/13/93)
Written by Fred N. van Kempen, MicroWalt Corporation.
DIP> help
DIP knows about the following commands:
databits default dial echo flush
get goto help if init
mode modem parity print port
reset send sleep speed stopbits
term wait
DIP> echo
Usage: echo on|off
DIP>

На протяжении всего текста примеры, которые начинаются с DIP> prompt, демонстрируют, как вводить команду в тестовом режиме и какой вывод она генерирует. Примеры, не содержащие prompt, следует рассматривать как фрагменты скрипта.

Команды модема

Существует ряд команд, которые dip использует для настройки вашей последовательной линии и модема. Некоторые из них являются очевидными, например, порт, который выбирает последовательный порт, и скорость, биты данных, стоповые биты и четность, которые устанавливают параметры линии. Команда модема позволяет выбрать тип модема. На данный момент единственный поддерживаемый тип - это HAYES. Вы должны указать тип модема dip, иначе он не будет набирать номер и выполнять команды сброса. Команда reset отправляет строку сброса модему; для модемов, совместимых с Hayes, это команда ATZ.

Echo и term

Команда Get

DIP> get $local ask
Enter the value for $local:

Третий способ - попробовать получить значение от удаленного хоста. Это может показаться странным, но это очень полезно в некоторых случаях: некоторые SLIP-серверы не позволяют вам использовать ваш собственный IP-адрес для SLIP-соединения, но будут присваивать вам один из пула адресов каждый раз, когда вы набираете номер, выводя сообщение, которое информирует вас о присвоенном адресе:

wait address: 10
get $locip remote

Команда Print

Эта команда позволяет выводить текст на консоль dip. В команде print можно использовать любые переменные dip, например:

DIP> print Using port $port at speed $speed
Using port cua3 at speed 38400

Имена переменных

Dip понимает только предопределенный набор переменных. Имя переменной всегда начинается с символа доллара и должно быть написано строчными буквами.

Переменные $local и $locip содержат название локального имени хоста и IP-адреса. Установка имени хоста заставляет dip сохранять каноническое имя хоста в $local, одновременно присваивая $locip соответствующий IP-адрес. То же самое происходит при установке $locip.

Переменные $remote и $rmtip выполняют аналогичную функцию, но для удалённых хостов и IP-адресов. $mtu содержит значение MTU для соединения. Эти пять переменных можно прямо назначить с помощью команды get. Остальные переменные, такие как $modem, $port и $speed, могут быть установлены только через соответствующие команды, но их также можно использовать в операторах print.

$errlvl — это переменная, через которую вы можете обратиться к результату последней выполненной команды. Если уровень ошибки равен 0, это указывает на успешное выполнение, в противном случае — на ошибку.

Команды If и Goto

Команда If в dip работает иначе, чем обычный оператор if. Синтаксис следующий:

if var op number goto label

где выражение должно быть простым сравнением одной из переменных $errlvl, $locip и $rmtip. Второй операнд должен быть целым числом; оператор op может принимать значения ==, !=, <, >, <= и >=. Команда goto переводит выполнение скрипта к строке с указанным меткой. Метка должна быть первым токеном в строке и завершаться двоеточием.

Команды send, wait и sleep

Эти команды позволяют выполнять простые chat-скрипты в dip. Команда send выводит её аргументы на последовательную линию. Она не поддерживает переменные, но понимает все C-style последовательности символов, такие как \n и \b. Знак тильды (~) используется как сокращение для возврата каретки и перевода строки. Команда wait принимает слово как аргумент и просматривает весь ввод на последовательной линии, пока не найдет это слово. Вы также можете задать для команды wait таймаут как второй аргумент; если ожидаемое слово не поступит в течение заданного времени, команда вернёт значение $errlvl равное 1.

Оператор sleep может быть использован для ожидания определённого времени, например, чтобы дождаться завершения процедуры входа в систему. Интервал задаётся в секундах.

Команды mode и default

Эти команды используются для переключения последовательной линии в режим SLIP и настройки интерфейса.

Команда mode — это последняя команда, которую выполняет dip перед переходом в режим демона. Если ошибок не возникло, команда ничего не возвращает. Mode принимает название протокола как аргумент. На данный момент dip распознает SLIP и CSLIP как допустимые имена. Текущая версия dip не поддерживает адаптивный SLIP.

После отключения режима SLIP на последовательной линии, dip выполняет команду ifconfig, чтобы настроить интерфейс как двухточечную связь, и задает маршруты к удаленным хостам.

Если перед командой mode в скрипте выполнена команда default, то dip также устанавливает маршрут по умолчанию через SLIP-соединение.