WebMoney: WMZ Z294115950220 WMR R409981405661 WME E134003968233 |
Visa 4274 3200 2453 6495 |
Хотелось бы иметь простую команду, которая выполняет все необходимые для
установки связи действия: открывает последовательное устройство,
дозванивается по модему до провайдера, регистрируется, запускает протокол
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 и передайте ему имя скрипта как аргумент командной строки:
Сам скрипт показан в примере 7-1
. Пример 7-1. Простой скрипт для dip После установления связи с cowslip и
запуска протокола SLIP dip отсоединится от терминала и
перейдет в фоновый режим. Вы сможете использовать обычные сетевые услуги на
SLIP-связи. Чтобы завершить связь, просто вызовите dip
c опцией -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 в тестовом режиме и вводя команду
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 on просит
dip пересылать копию диалога с последовательным
устройством на консоль. Эхо можно выключить командой
echo off. dipтакже позволяет Вам временно выключить режим
скрипта и выйти в режим терминала. В этом режиме Вы можете использовать
dip точно так же, как и обычную программу-терминал,
пишущую в последовательную линию и читающую из нее. Чтобы выйти из этого
режима, введите Ctrl-]. Команда get представляет собой способ
установки переменных в dip. Самая простая форма:
установить переменную как константу, как это делалось в вышеупомянутом
примере. Вы можете также спросить значение у пользователя, определяя
ключевое слово ask вместо значения:
Третий метод состоит в том, чтобы попробовать получить значение с
удаленного хоста. Причудливо на первый взгляд, но это очень полезно в
некоторых случаях: некоторые серверы-SLIP не позволяют Вам использовать Ваш
собственный IP-адрес на SLIP-связи, а будут приписывать Вам один из
своих адресов всякий раз, когда Вы набираете номер, печатая сообщение,
которое информирует Вас относительно адреса, который был назначен. Если
есть сообщение вроде "Your address: 192.168.5.74",
то следующий фрагмент кода dip его примет в Вашей
системе:
Отображает текст на консоли из dip. Любые
переменные dip могут быть использованы в таких
командах. Например:
dip понимает только предопределенное множество
переменных. Имя переменной всегда начинается с символа доллара и должно быть
написано в нижнем регистре. Переменные $local и
$locip хранят имя и IP-адрес локальной машины.
При сохранении в $local канонического имени,
dip автоматически преобразует его в IP-адрес и запишет
результат в переменную $locip. То же самое,
но в обратном порядке произойдет при записи в $locip
: dip получит имя для этого адреса и запишет
его в переменную $local. Переменные $remote и
$rmtip делают то же самое для удаленной
машины. $mtu хранит значение MTU для связи.
Эти пять переменных единственые, которые могут быть заданы
непосредственно, используя команду get.
Другие переменные могут быть установлены только через соответствующие
команды, но можно использовать и операторы print
; это $modem,
$port и $speed
. $errlvl переменная, через которую Вы
можете обращаться к результату последней выполненой команды. Уровень ошибки 0
указывает на успех, в то время, как ненулевое значение, обозначает ошибку.
Команда if полноценная команда
if, без которой нет ни одного языка программирования.
Ее синтаксис:
Команда 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-связи.
Linux Network Administrators Guide
Назад
Глава 7. Serial Line IP
Вперед
Использование
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
#
# 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.
# dip -k
Команды dip
# 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>
Команды модема
Команда echo
Команда get
DIP> get $local ask
Enter the value for $local:
# finish login
wait address: 10
get $locip remote
Команда print
DIP> print Using port $port at speed $speed
Using port ttyS3 at speed 38400
Имена переменных
Команды if и goto
где выражение должно быть простым сравнением с одной из переменных
$errlvl, $locip
и$rmtip.
var должен быть целым числом; оператор op
может быть одним из ==,
!=, <,
>, <= и
>=.
if var op number goto label
send, wait и sleep
mode и default
Назад
Глобальное
оглавление
Вперед
Работа с внутренними IP-сетями
Локальное
оглавление
Запуск в режиме сервера
Найди своих коллег! |