Использование 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.
- Команда flush может быть использована для того, чтобы очистить все ответы, которые модем отправил до текущего момента. В противном случае скрипт чата может запутаться из-за реакции OK от предыдущих команд.
- Команда init выбирает строку инициализации, которую следует отправить перед набором номера. Значение по умолчанию для модемов Hayes — это "ATE0 Q0 V1 X1", которое включает отображение команд и расширенный код результата, а также выбирает слепой набор (без проверки тонального сигнала).
- Команда dial в итоге отправляет строку инициализации модему и набирает номер. Команда набора по умолчанию для модемов Hayes - ATD.
Echo и term
- Команда ECHO служит для отладки. Используя ECHO ON, вы можете заставить dip выводить на консоль все, что отправляется на последовательное устройство. Это может быть отключено снова с помощью ECHO OFF.
- Dip также позволяет вам временно покинуть режим скрипта и перейти в режим терминала. В этом режиме вы можете использовать dip точно так же, как обычную программу терминала, записывая в последовательную линию и читая из нее. Чтобы выйти из этого режима, введите "Ctrl-]".
Команда Get
- Команда Get - это способ dip установить переменную. Простейший способ - установить переменную как константу, как это было сделано в вышеупомянутом примере. Вы также можете запросить пользователя ввести значение, указав ключевое слово вместо значения:
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-соединение.