in name of zero INOZ, issue #1, 20 nov. 2001 Язык скриптов для 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 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. Хранится непонятно где, а задается в дебрях этого диалога: Если у кого-нибудь есть соображения на этот счет, и в целом по статье, прошу свяжитесь со мной - rook@uinc.ru [7.] Благодарности. Спасибо Omire, за помощь в описании команд языка скриптов