Underground InformatioN Center [&articles] 
[network & security news] [RSS & Twitter] [articles, programing info] [books] [links, soft & more...] [soft archive][home]

Язык скриптов для dial-up соединений.

- И вот еще "Руководство для почивших"
- Руководство для почивших?
- Для покойников.
- Посмотри, какое издательство.
- Загробный мир.
"Битлджус", реж. Тим Бертон

Содержание:
[1.] Введение.
[2.] Переменные.
[3.] Математические выражения.
[4.] Команды, ключевые и зарезервированные слова.
[5.] DUN.
[6.] Заключение.
[7.] Благодарности.

[1.] Введение.

Эта статья была написана для ответа на вопрос "Как написать свой скрипт для dial-up соединения?" часто задававшийся в эхах фидо, на BBS, а теперь время от времени появляющийся у тех, кто хочет использовать сети x.25. Фактически данный документ является русским, несколько измененным, вариантом документа Dial-Up Scripting Command Language For Dial-Up Networking Scripting Support. Часть примеров была взята из скрипта для подсоединения к серверу SPb Code|NET.
Так для чего же нужны dial-up скрипты? Они позволяют автоматизировать операции по передаче/приему и обработке информации, которой обмениваются собой компьютеры при соединении по модему. Причем эта передача ограничивается пересылкой логина , пароля и получением IP адреса только для соединения с некоторыми Internet провайдерами, в основном же эти скрипты используются для подсоединения к BBS, а так же к специализированным серверам, где передав несколько строк можно сразу получить нужную информацию, а не искать ее по директориям (так сделано на серверах Spb Code|NET). Так же с помощью скриптов можно указывать, какие услуги нужны для устанавливаемого соединения. Если вам интересно каким образом можно использовать скрипты зайдите на любую поисковую машину и введите "Dial-up scripting".
Сам язык скриптов сильно напоминает язык BASIC, поэтому тем кто его знает будет проще.

[2.] Переменные

В сценарии подключения можно использовать переменные. Имена переменных должны состоять из набора букв английского алфавита цифр и знака подчеркивания - "_", но начинаться имена могут только с буквы или знака "_". В качестве имен переменных нельзя использовать зарезервированные слова, при работе скрипта такие имена будут обрабатываться как команды. Для использования предусмотрены три типа переменных:


Объявление переменных происходит следующим способом:
[тип] [имя переменной]=[начальное значение переменной]
Пример:

integer attempt = 3
; объявление переменной attempt типа integer и значением 3
string szLogin = "username:"
; объявление переменной szLogin типа string и значением username:

Для переменных типа string предусмотрен ряд специальных символов (литер), они следующие:


Пример:

transmit "^M"
; посылка символа возврата каретки
transmit "Rook^M"
; посылка строки, содержащей последовательность символов и знак перевода
; каретки.
transmit ""
waitfor ""
;ожидание ответа от удаленного компьютера

Существуют несколько системных переменных, которые определяются при вводе данных в диалоговом окне dial-up подключения и при выполнении команд. Эти команды представлены ниже:


Менять такие переменные пользователь не может, но допускается их использование как параметров команд.
Пример:

transmit $USERID
transmit $PASSWORD
; пересылка имени пользователя и пароля на удаленной компьютер.

Примечание: необходимо учитывать тип этих переменных при использовании в командах.

[3.] Математические выражения.

Математическое выражение - это комбинация математических операций и аргументов, представленных переменными или постоянными величинами. Выражения могут использоваться как параметры для команд.
Для использования предусмотрены следующие математические операции (положение в таблице показывает старшинство операции):


Примеры:

transmit "Hello from "+$USERID
delay 64/(32-(3+4*3))

Поскольку в этом языке нет типа real дробные результаты будут округляться.

[4.] Команды, ключевые и зарезервированные слова.

Все команды являются зарезервированными слова- это значит, что их нельзя использовать в качестве имен переменных, так же как и ключевые слова, которые представляют собой терминалы языка.
В языке скриптов для dial-up соединений есть следующие зарезервированные слова:
;
Точка с запятой показывает, на то, что все, идущее за ней является комментарием и не обрабатывается.
Пример:
; Это комментарий
integer a
; Следующий комментарий

AND
Логическое "Или"
Пример:

boolean a
boolean b

if !a and b then
endif


BOOLEAN
Ключевое слово для задания логического типа для переменной
Пример:

boolean name [ =value ]


DATABITS
см. set

DELAY nSeconds
Пауза между выполнением команд в секундах, записанная в nSeconds.
Пример:

integer seconds=5

delay 10
delay Seconds+2


DO
cм. while

ENDIF
см. if

ENDPROC
Указывает на конец процедуры

ENDWHILE
см. whille
EVEN
см. set port parity

FALSE
Булевская переменная, указывающее, что результат операции над булевыми переменными оказался ложным

GETIP [value]
Команда ожидает, когда будет получен IP адрес с удаленного компьютера. Если передается несколько IP адресов, они записываются в строчную переменную, для получения определенного IP адреса используйте параметр value.
Пример:

szAddress = getip
; передает первый полученный IP адрес в строку szAddress
szAddress = getip 2
; передает второй полученный IP адрес в строку szAddress


GOTO label
Переход на метку в скрипте указанную как label и продолжение выполнения команд с этого места.
Пример:

IF $SUCCESS then
goto _out
endif
Transmit "bbs^M"
Goto end
_out:
transmit "err^M"
end:


Примечание: место на которое необходимо перейти должна иметь тоже имя, что указано в команде goto, но после нее указывается знак двоеточия.

HALT
Прерывает работу скрипта, но не закрывает диалоговое окно. Перезапустить скрипт в этой сессии уже нельзя.

IF condition THEN
Ряд команд
ENDIF

выполняется ряд операций от then до endif, если condition=true;
Пример:

If $USERID == "Rook" then
transmit "CODENET.MEMBER.SENIOR.rook^M"
endif

INTEGER
Ключевое слово для задания целочисленного типа для переменной
Пример использования:

integer name [ =value ]


IPADDR
см. set

KEYBOARD
см. set

MARK
см. set port parity

MATCHCASE
см. waitfor

NONE
см. set port parity

ODD
см. set port parity

OFF
см. set screen keyboard

ON
см. set screen keyboard

OR
Логическое "И"

PARITY
см. set

PORT
см. set

PROC name
Указывает на начало процедуры. Любой скрипт должен содержать процедуру main, только по ней рн начинает и заканчивает выполнение. При этом общий вид процедуры такой:
proc main
Объявление переменных

Блок команд
endproc

RAW
см. transmit

SCREEN
см. set

SET
SET PORT DATABITS 5|6|7|8
Изменяет количество бит в байтах, пересылаемых и получаемых во время сессии. По умолчанию значение устанавливает таким, какое указано в настройках соединения.
Пример:
set port databits 7

SET PORT PARITY none|odd|even|mark|space
Изменяет четность порта через который передаются и принимаются данные во время сессии. По умолчанию значение устанавливает таким, какое указано в настройках соединения.
Пример:
set port parity even

SET PORT STOPBITS 1|2
Изменяет число стоп-битов на время сессии. По умолчанию значение устанавливает таким, какое указано в настройках соединения.
Пример:
set port stopbits 2

SET PORT SCREEN KEYBOARD on|off
Включает или выключает ввод с клавиатуры в окне терминала.
Пример:
set screen keyboard on

SET IPADDR _string
Устанавливает IP адрес для текущей сессии. Строка должна быть записана в формате IP адресов.
Примеры:
_ipaddress="11.83.23.1"
set ipadd _ipaddress
set ipaddr "11.83.23.1"
set ipaddr getip

SPACE
см. set port parity

STOPBITS
см. set

STRING
Ключевое слово для задания строкового типа для переменной
Пример использования:

string name [ =value ]


THEN
см. if

TRANSMIT _string [,raw]
Пересылка строки _string на удаленный компьютер. Удаленный компьютер может распознать escape последовательность и возврат каретки, если не используется параметр raw. Параметр raw используется, когда пересылаются $USERID и $PASSWORD в которых имеются указанные последовательности, иначе они будут восприняты как специальные символы. На практике это значит что пароль abc^Mddea будет послан как abc^M.
Примеры:

transmit "SLIP^M"
transmit $USERID, raw


TRUE
Булевская переменная, указывающее, что результат операции над булевыми переменными оказался верным

UNTIL
см. waitfor

WAITFOR string [,matchcase][then label {,string1[,matchcase]then label1}][until time]
Команда ожидает получения строк от удаленного компьютера, которые ассоциируются со string, string1 и так далее. Параметр sting не чувствителен к регистру, если не указан параметр matchcase. Если известная строка была получена и для нее был установлен параметр then label, то скрипт перейдет на указатель label. Параметр until устанавливает время ожидания ответа от удаленного компьютера, прежде чем перейти к следующей команде, без этого параметра компьютер будет ожидать постоянно.
Примеры:

Waitfor "Login:"
; это означает, что будет ожидаться появление строки Login:
waitfor
"Login:" then _login
"Password:" then _password
until 15



WHILE condition DO
Ряд команд
ENDWHILE

Цикл по командам, пока условние condition не станет ложным.
Пример:

integer attempt=3
integer n=0
while n transmit "^M"
waitfor "Login: " until 15
if $SUCCESS then
goto _login
endif
n=n+1
endwhile

[5.] DUN

Файлы с таким расширением создаются мастером новых соединение и представляют собой запись всех установленных параметров, включая все настройки модема и скрипт для соединения. Как ни странно, но в чистом виде на диске они не записываются, но если воспользоваться сервисом drag&drоp и перенести созданный файл в любую папку, то при просмотре можно будет увидеть подобный файл (файл экспорта):

;Файл aanet.ru.dun
[Entry]
Entry_Name=AANET.RU
Import_Name=AANET 3
Multilink=no

[Phone]
Dial_As_Is=no
Phone_Number=XXXXXXX
Area_Code=
Country_Code=7
Country_ID=7

[Device]
Type=modem
Name=LT Win Modem
Settings_Size=108
Settings=1C000100130101100100180060100001010102001C02020002C22102122200
2000400A500100180200311340050000600600060034000000300000003000000030000
00000000000000000003C000000000000000000000001000000D3010000000000000000
0000000000000C
[Server] Type=PPP SW_Compress=no PW_Encrypt=no Network_Logon=no SW_Encrypt=no Negotiate_NetBEUI=no Negotiate_IPX/SPX=no Negotiate_TCP/IP=yes [TCP/IP] Specify_IP_Address=no Specify_Server_Address=yes DNS_address=XXX.XXX.XXX.XX DNS_Alt_address=XXX.XXX.XXX.XX WINS_address=0.0.0.0 WINS_Alt_address=0.0.0.0 IP_Header_Compress=yes Gateway_On_Remote=yes [Scripting] Name=Pppmenu.scp [Script_File] 0=; 1=; This is a script file that demonstrates how 2=; to establish a PPP connection with a host 3=; that uses a menu system. 4=; 5=; A script file must have a 'main' procedure. 6=; All script execution starts with this 'main' 7=; procedure. 8=; 9= 10= 11=; Main entry point to script 12=; 13=proc main 14= 15=; Change these variables to customize for your 16=; specific Internet service provider 17= 18=integer nTries = 3 19= 20=; This is the login prompt and timeout values 21= 22=string szLogin = "username:" 23=integer nLoginTimeout = 3 24= 25=; This is the password prompt and timeout values 26= 27=string szPW = "password:" 28=integer nPWTimeout = 3 29= 30=; This is the prompt once your password is verified 31= 32=string szPrompt = "annex:" 33= 34=; This is the command to send to establish the 35=; connection. This script assumes you only need 36=; to issue one command to continue. Feel free 37=; to add more commands if your provider requires 38=; it. 39= 40=; 41=; This provider has a menu list like this: 42=; 43=; 1 : Our special GUI 44=; 2 : Establish slip connection 45=; 3 : Establish PPP connection 46=; 4 : Establish shell access 47=; 5 : Download our software 48=; 6 : Exit 49=; 50=; annex: 51=; 52= 53=string szConnect = "3^M" 54= 55=; Set this to FALSE if you don't want to get an IP 56=; address 57= 58=boolean bUseSlip = FALSE 59= 60= 61=; ----------------------------------------------------- 62= 63= 64=; Delay for 2 seconds first to make sure the 65=; host doesn't get confused when we send the 66=; two carriage-returns. 67= 68=delay 2 69=transmit "^M^M" 70= 71=; Attempt to login at most 'nTries' times 72= 73=while 0 < nTries do 74= 75=; Wait for the login prompt before entering 76=; the user ID, timeout after x seconds 77= 78=waitfor szLogin then DoLogin 79=until nLoginTimeout 80= 81=TryAgain: 82=transmit "^M" ; ping 83=nTries = nTries - 1 84= 85=endwhile 86= 87=goto BailOut 88= 89=DoLogin: 90=; Enter user ID 91= 92=transmit $USERID, raw 93=transmit "^M" 94= 95=; Wait for the password prompt 96= 97=waitfor szPW until nPWTimeout 98=if FALSE == $SUCCESS then 99=goto TryAgain 100=endif 101= 102=; Send the password 103= 104=transmit $PASSWORD, raw 105=transmit "^M" 106= 107=; Wait for the prompt 108= 109=waitfor szPrompt 110= 111=transmit szConnect 112= 113=if bUseSlip then 114=; An alternative to the following line is 115=; 116=; waitfor "Your address is " 117=; set ipaddr getip 118=; 119=; if we don't know the order of the IP addresses. 120= 121=set ipaddr getip 2 122=endif 123=goto Done 124= 125=BailOut: 126=; Something isn't responding. Halt the script 127=; and let the user handle it manually. 128= 129=set screen keyboard on 130=halt 131= 132=Done: 133= 134=endproc 135=

Как уже было написано выше, в файл DUN, в раздел [Script_File], включается Dial-up скрипт целиком с коментариями и с пустыми строками. В раздел [Scripting] записывается имя файл со скриптом, это сделано для того, чтобы при подсоединении была возможность автоматически обновить используемый скрипт.

[6.] Заключение.

В Windows 9x/Me существует такая интересная вещь - для одного файла DUN могут существовать 3 разные настройки:
1. Хранится собственно в файле создаваемом мастером.
2. Хранится в файле экспорта, а при его изменении создается новое соединение (а не изменяется существующее).
3. Хранится непонятно где, а задается в дебрях этого диалога:


Если у кого-нибудь есть соображения на этот счет, и в целом по статье, прошу свяжитесь со мной.

Ссылки:

MS RAS and X.25 - Evaluation, Implementation, and Troubleshooting for All RAS Versions

[7.] Благодарности.

Спасибо Omire, за помощь в описании команд языка скриптов


(c) Alex D. Sergeev aka Rook rook@uinc.ru
(c) uinC Team
Статья написана специально для UInC (http://www.uinc.ru).
Last Changes: 12-11-2001

Все документы и программы на этом сайте собраны ТОЛЬКО для образовательных целей, мы не отвечаем ни за какие последствия, которые имели место как следствие использования этих материалов\программ. Вы используете все вышеперечисленное на свой страх и риск.

Любые материалы с этого сайта не могут быть скопированы без разрешения автора или администрации.


[network & security news] [RSS & Twitter] [articles, programing info] [books] [links, soft & more...] [soft archive][home]
 Underground InformatioN Center [&articles] 
2000-2015 © uinC Team