/*-----------------------------------------------------------------------*/
/* R I N G 0, I S S U E # 1 */
/*-----------------------------------------------------------------------*/
Язык скриптов для dial-up соединений.
by Alex D. Sergeev aka Rook/UINC
- И вот еще "Руководство для почивших"
- Руководство для почивших?
- Для покойников.
- Посмотри, какое издательство.
- Загробный мир.
"Битлджус", реж. Тим Бертон
Содержание:
[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 Целые числа
string Строка символов
boolean Логическая переменная
Объявление переменных происходит следующим способом:
[тип] [имя переменной]=[начальное значение переменной]
Пример:
…
integer attempt = 3
; объявление переменной attempt типа integer и значением 3
string szLogin = "username:"
; объявление переменной szLogin типа string и значением username:
…
Для переменных типа string предусмотрен ряд специальных символов
(литер), они следующие:
^char Перевод символа в его ascii код
<cr> Возврат каретки
<lf> Перевод строки
\\ Обратный слеш
\^ Символ ^
Пример:
…
transmit "^M"
; посылка символа возврата каретки
transmit "Rook^M"
; посылка строки, содержащей последовательность символов и знак перевода
; каретки.
transmit ""
waitfor ""
;ожидание ответа от удаленного компьютера
…
Существуют несколько системных переменных, которые определяются при
вводе данных в диалоговом окне dial-up подключения и при выполнении
команд. Эти команды представлены ниже:
$userid Идентификатор пользователя
$password Пароль
$success Удачное завершение команды
$failure Неудачное завершение команды
Менять такие переменные пользователь не может, но допускается их
использование как параметров команд.
Пример:
…
transmit $USERID
transmit $PASSWORD
; пересылка имени пользователя и пароля на удаленной компьютер.
…
Примечание: необходимо учитывать тип этих переменных при использовании в
командах.
[3.] Математические выражения.
Математическое выражение - это комбинация математических операций и
аргументов, представленных переменными или постоянными величинами.
Выражения могут использоваться как параметры для команд. Для
использования предусмотрены следующие математические операции (положение
в таблице показывает старшинство операции):
Унарные операции
- Унарный минус
! Отрицание
Бинарные операции
*,/ Умножение, деление Integer
+,- Сложение, вычитание Integer, String, Boolean
<,>,>=,<= Отношение Integer
==,!= Сравнение Integer, String
and Логическое "И" Boolean
or Логическое "Или" Boolean
Примеры:
…
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. Хранится непонятно где, а задается в дебрях этого диалога:
[картинку сперли]
http://uinc.ru:8101/articles/27/remote.gif
Если у кого-нибудь есть соображения на этот счет, и в целом по статье,
прошу свяжитесь со мной - [email protected]
[7.] Благодарности.
Спасибо Omire, за помощь в описании команд языка скриптов