Ngôn ngữ lệnh kịch bản Dial-up
trong Dial-up Networking
Xem bai viet bang font ABC

PCWorld VN 11/99

Tổng quan

    Chắc bạn đã một lần truy cập mạng WAN hay Internet và đều không thoát khỏi thủ tục đầu tiên là thực hiện kết nối với máy chủ trước khi có thể làm những việc tiếp theo. Thông thường quá trình kết nối đơn giản và tự động - chỉ cần khai báo tên người sử dụng và mật khẩu là có thể đăng nhập vào mạng. Nhưng cũng có nhiều nhà cung cấp dịch vụ Internet (ISP: Internet Service Provider) và dịch vụ trực tuyến (OS: Online Service) đòi hỏi bạn phải nhập bằng tay các thông tin như tên người sử dụng và mật khẩu khi thiết lập một kết nối. Chưa hết, bạn không thể kết nối với một số máy chủ nếu không cho chạy một file đặc biệt để cung cấp cho nó những thông tin cần thiết. Đây chính là một kịch bản được viết bằng ngôn ngữ lệnh kịch bản DUN (Dial-Up Networking Scripting Command Language). Để tự động hoá quá trình kết nối cũng như có thể truy nhập vào được một số máy chủ khó tính, tôi xin trình bày sơ lược dưới đây về ngôn ngữ này.

    Ngôn ngữ lệnh kịch bản DUN là sản phẩm của Microsoft, ra đời cùng với Windows 95 và không thay đổi trong các phiên bản 97, rồi 98 sau này. Kịch bản DUN là một file dạng văn bản có chứa một chuỗi các lệnh, tham số và biểu thức được ISP hay OS yêu cầu để thiết lập kết nối và sử dụng các dịch vụ. Bạn có thể sử dụng bất cứ trình soạn thảo văn bản nào có thể lưu file dưới dạng text thuần tuý để tạo file kịch bản (chẳng hạn như Microsoft Notepad, NC Editor, DOS Editorà). Các file kịch bản thường được lưu dưới phần mở rộng là .scp để dễ phân biệt. Một khi đã tạo file kịch bản, bạn có thể liên kết nó vào một kết nối DUN bằng cách chạy Dial-Up Scripting Tool.

Cách thi hành một file lệnh kịch bản

    Khi đã tạo một file kịch bản DUN, bạn có thể chạy nó bằng cách sau: từ cửa sổ My Computer.Dial-Up Networking, nhấn phím phải chuột vào kết nối mà bạn muốn cho chạy kịch bản DUN, chọn Properties. Trong cửa sổ Properties, chọn Scripting, gõ tên đường dẫn và tên file kịch bản của bạn vào ô Script file, bạn cũng có thể sử dụng lệnh Browse để tìm file kịch bản. Sau đó chọn OK. Từ nay trở đi, mỗi khi bạn sử dụng kết nối đó để kết nối vào một ISP hay OS thì các lệnh trong file kịch bản DUN của bạn sẽ được thi hành một cách tự động.

    Cấu trúc cơ bản của một kịch bản

    Lệnh là các chỉ thị cơ bản trong một file kịch bản DUN. Một số lệnh đòi hỏi các tham số mô tả những gì mà lệnh đó phải thực hiện.

    Biểu thức là sự kết hợp giữa các toán tử và đối số, cho ra một kết quả. Biểu thức có thể được sử dụng như là một giá trị trong mọi lệnh. Biểu thức có thể chứa các phép toán số học, phép so sánh quan hệ và ghép chuỗi.

    Dạng cơ bản của một file kịch bản DUN như sau:

;
; Một ghi chú bắt đầu bằng dấu chấm phẩy (;)
; và kéo dài đến cuối dòng
;
proc main
;Một kịch bản có thể có mọi kiểu biến
;và kiểu lệnh
các khai báo biến
khối lệnh
endproc

    Một kịch bản DUN nhất thiết phải có thủ tục chính, đặc trưng bằng từ khoá proc và kết thúc bằng từ khoá endproc.

    Bạn phải khai báo các biến trước khi sử dụng cho các lệnh. Các lệnh sau đó được thi hành một cách tuần tự theo đúng thứ tự mà nó được viết trong file kịch bản DUN. Kịch bản kết thúc khi gặp từ khoá endproc.

Các biến

    Kịch bản DUN có thể chứa các biến. Tên của các biến phải bắt đầu bằng một ký tự chữ cái hay dấu gạch dưới (_) và có thể chứa chuỗi ký tự thường, ký tự hoa, các số và dấu gạch dưới. Bạn không thể sử dụng các từ dành riêng để làm tên biến. Để có thêm thông tin, hãy xem bảng liệt kê các từ dành riêng ở cuối bài viết này.

    Bạn phải khai báo các biến trước khi có thể sử dụng chúng. Khi khai báo một biến, bạn cũng phải định nghĩa kiểu của nó. Biến của một số kiểu chỉ có thể chứa các giá trị cùng kiểu. Ba kiểu biến sau đây được sử dụng trong ngôn ngữ lệnh kịch bản DUN:

Integer: Biểu diễn các số nguyên âm và dương, ví dụ 7, -12 hay 5698

String: Biểu diễn chuỗi các ký tự trong ngoặc kép, ví dụ "Hello world !" hay "Enter your password:"

Boolean: Biểu diễn các giá trị luận lý TRUE hay FALSE

Các biến được gán giá trị bằng cách sử dụng phát biểu gán sau:

Biến = biểu thức

Biến sẽ nhận giá trị được tính từ biểu thức.

Thí dụ:
integer count = 5
;khai báo biến count có kiểu integer và
;gán cho nó trị khởi động là 5
integer timeout = (4*3)
;khai báo biến timeout có kiểu integer
;và gán cho nó giá trị 12 nhận được từ
;biểu thức (4*3)
integer i
boolean bDone = FALSE
string szIP = (getip 2);khai báo biến szIP
; có kiểu là string và
;gán cho nó trị ban đầu lấy từ lệnh
;(getip 2)
set ipaddr szIP
á

    Việc sử dụng cặp dấu ngoặc không mang ý nghĩa gì đặc biệt trong các ví dụ trên, nó chỉ làm cho câu lệnh thêm rõ ràng.

Các biến hệ thống

    Các biến hệ thống được đặt bằng các câu lệnh kịch bản DUN hay được xác định bằng các thông tin mà bạn đưa vào khi thiết lập một kết nối DUN. Các biến hệ thống có thuộc tính chỉ đọc, có nghĩa là chúng không thể thay đổi trong kịch bản. Các biến hệ thống bao gồm:

$USERID (kiểu: string): Biến nhận dạng người sử dụng cho kết nối hiện thời. Biến này mang giá trị là tên user name trong hộp thoại Connect To khi thực hiện một kết nối.

$PASSWORD (string): Mật khẩu cho kết nối hiện thời. Biến này mang giá trị password trong hộp thoại Connect To khi thực hiện kết nối.

$SUCCESS (boolean): Biến này được đặt bởi một số lệnh để chỉ ra rằng lệnh có được thực hiện thành công hay không. Kịch bản có thể ra quyết định dựa trên giá trị của biến này.

$FAILURE (boolean): Biến này được đặt bởi một số lệnh để chỉ ra rằng lệnh có thất bại hay không. Kịch bản có thể ra quyết định dựa trên giá trị của biến này.

    Các biến trên đây có thể được sử dụng ở những nơi mà một biểu thức có kiểu tương tự được sử dụng. Thí dụ câu lệnh sau:

transmit $USERID

    là hợp lệ bởi vì $USERID là biến có kiểu string.

Chuỗi ký tự

    Ngôn ngữ lệnh kịch bản DUN cho phép sử dụng chuỗi escape (escape sequences) và chuỗi caret (caret translation) và được mô tả dưới đây.

^char: Chuỗi caret. Nếu char là một giá trị trong khoảng ?@' và ?_? thì chuỗi ký tự được dịch thành các giá trị byte đơn trong khoảng từ 0 đến 31. Thí dụ, ^M được chuyển thành mã xuống dòng carriage return.

    Nếu char là một giá trị trong khoảng từ "a" đến "z" thì chuỗi ký tự được dịch thành các byte đơn trong khoảng từ 1 đến 26.

    Nếu char có giá trị bất kỳ khác, chuỗi ký tự không được xử lý.

<cr> Ký hiệu xuống dòng carriage return

<lf> Ký hiệu về đầu dòng

\" Dấu nháy kép "

\^ Dấu mũ ^

\< Dấu <

\\ Dấu \

Thí dụ:
transmit "^M" ;gửi đi ký tự xuống dòng Enter
transmit "Joe^M" ;gửi đi chuỗi Joe và ký tự xuống dòng
transmit "<cr><lf>" ;gửi đi ký tự xuống và về đầu dòng
waitfor "<cr><lf>" ;chờ nhận được ký tự xuống và về đầu dòng

Biểu thức

    Biểu thức là sự kết hợp giữa các toán tử và đối số, cho ra một kết quả. Biểu thức có thể sử dụng như giá trị trong mọi câu lệnh.

    Biểu thức có thể kết hợp mọi biến (kiểu integer, string, boolean) với mọi toán tử tính chất và toán tử kết hợp như trong các bảng dưới đây. Mọi toán tử tính chất đều có độ ưu tiên cao nhất. Độ ưu tiên của các toán tử kết hợp được sắp xếp như sau.

    Các toán tử tính chất:

- : dấu âm

! : phần bù của một giá trị

    Các toán tử kết hợp được liệt kê sau theo thứ tự ưu tiên của chúng. Các toán tử có độ ưu tiên cao hơn được liệt kê trước:

* / : Nhân chia (integer)

+ - : Cộng trừ (integer, string (chỉ sử dụng với toán tử +))

<, >, <=, >= : Quan hệ (integer)

==, != :So sánh (integer, string, boolean)

and : Luận lý AND (boolean)

or : Luận lý OR (boolean)

Thí dụ:
count = -x ;gán phần âm của x cho count
yes = !FALSE ;gán trị TRUE cho biến yes
count = 3 + 5 * 40 ;gán trị 203 cho biến count
transmit "Hello" + " there" ;chuyển đi chuỗi "Hello there"
delay 24 / (7 ố 1) ;tạm dừng trong vòng 4 giây

Ghi chú

    Tất cả chuỗi ký tự trên cùng một dòng bắt đầu bằng một dấu chấm phẩy (;) đều được bỏ qua khi kịch bản chạy. Chuỗi ký tự sau dấu chấm phẩy được sử dụng để thêm các ghi chú vào kịch bản.

Thí dụ:
; đây là một ghi chú
transmit "hello" ; chuyển chuỗi "hello" đi

Các từ khóa

    Các từ khoá đặc trưng cho cấu trúc của ngôn ngữ lệnh kịch bản DUN. Không giống như các câu lệnh, chúng không thực hiện một hành động. Các từ khoá của ngôn ngữ lệnh kịch bản DUN được liệt kê như sau:

proc name: Từ khoá chỉ ra sự bắt đầu của một thủ tục. Tất cả kịch bản phải có một thủ tục chính (proc main). Kịch bản bắt đầu thi hành từ thủ tục chính và kết thúc cũng tại thủ tục chính.

endproc: Từ khoá chỉ ra sự kết thúc của một thủ tục. Khi một kịch bản thực hiện đến phát biểu endproc của thủ tục chính, Dial-Up Networking sẽ khởi động PPP (Point to Point Protocol: giao thức điểm đối điểm) hay SLIP (Serial Line Internet Protocol: giao thức Internet dùng đường nối tiếp) để hoàn thành kết nối.

integer name [= value]: Từ khoá dùng để khai báo một biến name có kiểu integer. Bạn có thể sử dụng bất kỳ biểu thức hay biến số học nào để gán trị ban đầu cho biến này.

string name [= value]: Từ khoá dùng để khai báo một biến name có kiểu string. Bạn có thể sử dụng bất kỳ chuỗi ký tự hay biến số học nào để gán trị ban đầu cho biến này.

boolean name [= value]: Từ khoá dùng để khai báo một biến name có kiểu boolean. Bạn có thể sử dụng bất kỳ biểu thức hay biến boolean nào để gán trị ban đầu cho biến này.

Các câu lệnh

    Tất cả các lệnh là các từ dành riêng, có nghĩa là bạn không thể khai báo các biến có cùng tên với các lệnh. Các lệnh trong ngôn ngữ lệnh kịch bản DUN:

delay nSeconds: Tạo thời gian dừng theo số giây được chỉ trong tham số nSeconds trước khi thi hành tiếp lệnh kế tiếp trong kịch bản.

Thí dụ
delay 2 ;tạo thời gian dừng 2 giây
delay x * 3 ;tạo thời gian dừng x*3 giây

getip value: Đợi để nhận địa chỉ IP (Internet Protocol : giao thức Internet) từ máy tính đang được truy cập. Nếu ISP của bạn trả lại các địa chỉ IP trong một chuỗi, khi này ta sử dụng tham số value để qui định địa chỉ IP nào trong chuỗi được sử dụng.

Thí dụ:
;nhận địa chỉ IP thứ hai trong chuỗi nhận về
set ipaddr getip 2 ;gán địa chỉ IP đầu tiên
;vào biến szAddress
szAddress = getip

goto label: Nhảy đến vị trí trong kịch bản được chỉ ra bởi nhãn label và tiếp tục thực hiện các lệnh sau nhãn label. Các nhãn label phải đứng sau dấu ":"

Thí dụ:
waitfor "Prompt>" until 10
if !$SUCCESS then
Goto BailOut ;nhảy đến nhãn BailOut và
;thực hiện các lệnh sau nó
endif
transmit "bbs^M"
goto End
BailOut:
Transmit "^M"

halt: Ngừng thực thi kịch bản. Lệnh này không loại bỏ hộp thoại Terminal. Bạn phải nhấn chuột vào nút Continue để thiết lập lại kết nối. Bạn không thể khởi động lại kịch bản.

if điều kiện then

các lệnh

endif

Thi hành một chuỗi các lệnh nếu điều kiện là TRUE

Thí dụ:
;nếu biến hệ thống $USERID là John thì
if $USERID == "John" then
;chuyển đi chuỗi Johnny và ký tự xuống dòng
transmit "Johnny^M"
endif

Nhãn: Chỉ ra vị trí trong kịch bản để nhảy trong câu lệnh goto. Nhãn phải là một tên thống nhất trong suốt kịch bản và tuân theo cách đặt tên của biến.

set port databits 5/ 6 /7 /8: Thay đổi số lượng bit trong một byte được truyền và nhận trong suốt kết nối. Số lượng bit có thể thay đổi trong khoảng từ 5 đến 8. Nếu bạn không sử dụng lệnh này, DUN sẽ sử dụng các thiết lập phù hợp đối với mỗi kết nối.

Thí dụ:
set port databits 7

set port parity none | old | even | mark | space: Thay đổi sự phối hợp bình đẳng cho cổng trong quá trình kết nối. Nếu bạn không sử dụng lệnh này, DUN sẽ sử dụng các thiết lập phù hợp đối với mỗi kết nối

Thí dụ:
set port parity even

set port stopbits 1 | 2: Thay đổi số lượng bit dừng cho cổng trong quá trình kết nối. Số bit dừng có thể là 1 hay 2. Nếu bạn không sử dụng lệnh này, DUN sẽ sử dụng các thiết lập phù hợp đối với mỗi kết nối

Thí dụ:
set port stopbits 2

set screen keyboard on | off: Kích hoạt hay vô hoạt khả năng nhập liệu từ bàn phím trong cửa sổ Terminal

Thí dụ:
set screen keyboard on

set ipaddr string: Chỉ ra địa chỉ IP của trạm làm việc trong quá trình kết nối. Tham số string phải có dạng địa chỉ IP

Thí dụ:
szIPAddress= "11.543.23 .13"
set ipaddr szIPAddress
set ipaddr "11.543.23.13"
set ipaddr getip

transmit string [,raw]: Gửi các ký tự trong chuỗi string đến máy tính từ xa.

    Máy tính từ xa sẽ nhận biết chuỗi escape và chuỗi caret lúc dịch trừ khi bạn thêm tham số raw vào câu lệnh. Tham số raw rất hữu dụng khi chuyển đi các biến hệ thống $USERID và $PASSWORD có chứa các ký tự đặc biệt mà nếu không sử dụng tham số raw, các ký tự này sẽ được dịch như các chuỗi escape và caret.

Thí dụ:
transmit "slip" + "^M"
;chuyển đi biến hệ thống $USERID với nguyên
;dạng đưa vào
transmit $USERID, raw

waitfor string[, matchcase] [then label

{, string [, matchcase] then label}]

[until time]: Chờ cho đến khi máy tính nhận được một hay nhiều chuỗi ký tự được qui định trong chuỗi string từ máy tính từ xa. Tham số string không phân biệt chữ hoa và chữ thường trừ khi bạn thêm vào tham số matchcase.

    Nếu một chuỗi ký tự khớp với string được nhận, lệnh then label được sử dụng và sẽ nhảy đến vị trí trong kịch bản có nhãn label.

    Tham số tuỳ chọn until time được định nghĩa là số thời gian tối đa mà máy tính phải chờ để nhận được chuỗi thích hợp từ máy tính từ xa trước khi thi hành lệnh kế tiếp trong kịch bản. Nếu không có tuỳ chọn này, máy tính của bạn sẽ chờ máy tính từ xa cho đến khi nào chuỗi thích hợp được nhận.

    Nếu máy tính của bạn nhận được các chuỗi thích hợp, biến hệ thống $SUCCESS được đặt là TRUE. Ngược lại, nó được đặt là FALSE nếu thời gian chờ đã hết trước khi nhận được chuỗi thích hợp.

Thí dụ:
waitfor "Login:";chờ nhận được chuỗi Login
waitfor "Password ?", matchcase
;chờ nhận được chuỗi Prompt trong vòng 10
;giây
waitfor "Prompt>" until 10
waitfor
"Login:" then DoLogin
"Password?"then DoPassword
"BBS:" then DoBBS
"Other:" then DoOther
until 10

while điều kiện do

các lệnh

endwhile

Thi hành các lệnh cho đến khi điều kiện là FALSE.

Thí dụ:
integer count = 0
while count < 4 do
transmit "^M"
waitfor "Login:" until 10
if $SUCCESS then
goto DoLogin
endif
count = cont +1
endwhile

    Các từ dành riêng

    Các từ sau đây được ngôn ngữ lệnh kịch bản DUN sử dụng như là các từ dành riêng; bạn không thể sử dụng chúng để đặt tên cho các biến.

and boolean databits delay do endif endproc endwhile even FALSE getip goto halt if integer idaddr keyboard mark on or parity port proc raw screen set space stopbits string then transmit TRUE until waitfor while

Xây dựng ứng dụng

    Như vậy là chúng ta đã khảo sát hầu như toàn bộ ngôn ngữ lệnh kịch bản DUN. Ngôn ngữ này không chỉ phát huy thế mạnh tự động hoá việc nối kết mà trong một số trường hợp nó là thứ không thể thiếu đối với việc nối kết vào một số ISP. Ơở Việt Nam, có những máy chủ khi kết nối vào chúng, bạn phải bắt buộc sử dụng ngôn ngữ lệnh kịch bản DUN. Thí dụ như máy chủ của VDC đặt tại Vũng Tàu. Để kết nối vào máy chủ này, bạn phải chạy một file có tên X25.SCP đầy bí hiểm và nếu bạn hỏi các quản mạng viên về chúng thì chắc chắn chỉ nhận được sự im lặng! (tôi đã từng hỏi). Nhưng thực ra file này chỉ chứa một số lệnh kịch bản đơn giản sau:

proc main
delay 2
transmit "@D^M"
waitfor "NAL="
transmit "^M"
waitfor "@"
transmit "97340046^M"
delay 1
endprocá

    Chắc khỏi cần thuyết minh các bạn cũng hiểu được ý nghĩa của từng câu lệnh trên đây.

    Sau khi nắm vững cách sử dụng ngôn ngữ lệnh kịch bản DUN (tôi nghĩ là nó dễ hơn nhiều so với các ngôn ngữ khác), tôi tin rằng các bạn sẽ viết được những file kịch bản DUN để tự động hoá công việc kết nối của mình.

Nguyễn Tất Vũ

T26 Hoàng Hoa Thám, P.13, Q.Tân Bình TP. Hồ Chí Minh

Tel : (8) 842 8492

E-mail: genhitsuu@yahoo.com

Theo Dial-Up Scripting Command Language for DUN scripting support- Microsoft Corp. (1995)


PcLeHoan 1996 - 2002
Mirror : http://www.pclehoan.com
Mirror : http://www.lehoanpc.net

Mirror : http://www.ktlehoan.com