Là ngôn ngữ tự động điền các thao tác của chúng ta ví dụ như password hay user của 1 ftp hay bất cứ gì đó mà file Script Bash Shell không thể thực hiện được thì với Expect Command nó sẻ hỗ trợ giúp bạn.
Nếu Expect Command chưa thật sự cài trên hệ thống của bạn thì bạn thực hiện dòng lệnh sau để cài đặt:
$ apt-get install expect
Hoặc nếu đó là hệ điều hành Centos Red Hat chẳng hạn thì bạn sử dung dòng lệnh này để install
$ yum install expect
Expect Command
Trước khi chúng tôi nói chuyện về expect lệnh, hãy xem một số lệnh expect sử dụng để tương tác với:
spawn Starting a script or a program.
expect Waiting for program output.
send Sending a reply to your program.
interact Allowing you in interact with your program.
- Lệnh được sử dụng để bắt đầu một kịch bản hoặc một chương trình như vỏ, FTP, Telnet, SSH, SCP và như vậy.
- Gửi lệnh được sử dụng để gửi một thư trả lời một kịch bản hoặc một chương trình.
- Lệnh Expect waits cho đầu vào.
- Lệnh tương tác cho phép bạn xác định một tương tác người dùng định sẵn.
Chúng ta sẽ phải loại một kịch bản mà yêu cầu một số câu hỏi và chúng tôi sẽ làm cho một kịch bản Expect sẽ trả lời những câu hỏi.
Đầu tiên, kịch bản sẽ trông như thế này:
#!/bin/bashecho "Hello, who are you?"
read $REPLY
echo "Can I ask you some questions?"
read $REPLY
echo "What is your favorite topic?"
read $REPLY
Bây giờ chúng ta sẽ viết các Expect scripts that will answer this automatically:
#!/usr/bin/expect -fset timeout -1
spawn ./questions
expect "Hello, who are you?\r"
send -- "Im Adam\r"
expect "Can I ask you some questions?\r"
send -- "Sure\r"
expect "What is your favorite topic?\r"
send -- "Technology\r"
expect eof
Dòng đầu tiên xác định đường dẫn lệnh expect là
#!/usr/bin/expect .
#!/usr/bin/expect .
Chúng tôi có thể sử dụng đẻ trứng để chạy bất kỳ chương trình nào chúng ta muốn hay bất cứ kịch bản tương tác khác.
Các dòng còn lại là Expect kịch bản mà tương tác với kịch bản của chúng tôi.
Cuối dòng nếu kết thúc tệp có nghĩa là kết thúc của sự tương tác.
Bây giờ Showtime, hãy chạy bot câu trả lời của chúng tôi và chắc chắn rằng bạn làm cho nó thực thi.
$ chmod +x ./answerbot$./answerbot
Cool!! Tất cả câu hỏi được trả lời như chúng ta mong đợi.
Nếu bạn nhận được lỗi về vị trí của Expect lệnh có thể vị trí bằng cách sử dụng mà các lệnh:
$ which expect
Chúng tôi đã không tương tác với kịch bản của chúng tôi ở tất cả, chương trình Expect làm công việc cho chúng tôi.
Phương pháp trên có thể được áp dụng cho bất kỳ kịch bản tương tác hoặc chương trình. Mặc dù kịch bản Expect ở trên là rất dễ dàng để viết, có lẽ Expect kịch bản ít khó khăn cho một số người, cũng bạn có nó.
Using autoexpect
Để xây dựng một kịch bản expect tự động, bạn có thể sử dụng autoexpect lệnh.
autoexpect hoạt động như mong đợi, nhưng nó xây dựng kịch bản tự động hóa cho bạn. Các kịch bản mà bạn muốn tự động được thông qua để autoexpect như một tham số và bạn trả lời các câu hỏi và câu trả lời của bạn sẽ được lưu trong một tập tin.
$ autoexpect ./questions
$ autoexpect ./questions
Một tập tin được tạo ra được gọi là script.exp có chứa mã tương tự như chúng tôi đã làm ở trên với một số bổ sung rằng chúng tôi sẽ để lại nó cho bây giờ.
Nếu bạn chạy tự động tạo ra tập tin script.exp, bạn sẽ thấy những câu trả lời tương tự như mong đợi:
Tuyệt vời!! Là siêu dễ dàng.
Có rất nhiều lệnh sản xuất ra có thể thay đổi, như trường hợp của chương trình FTP, các kịch bản expect có thể thất bại hoặc bị mắc kẹt. Để giải quyết vấn đề này, bạn có thể sử dụng ký tự đại diện cho các dữ liệu có thể thay đổi để làm cho script của bạn linh hoạt hơn.
Working with Variables
Các lệnh thiết lập được sử dụng để xác định các biến trong script Expect như thế này:
set MYVAR 5
Để truy cập vào các biến, đứng trước nó với $ như thế này $VAR1
Để xác định đối số dòng lệnh trong Expect kịch bản, chúng tôi sử dụng cú pháp sau:
set MYVAR [lindex $argv 0]
Ở đây, chúng ta định nghĩa một biến MYVAR mà bằng đối số đầu tiên thông qua.
Bạn có thể nhận được đầu tiên và các đối số thứ hai và lưu trữ chúng trong các biến như thế này:
Hãy thêm các biến vào kịch bản của chúng tôi:
#!/usr/bin/expect -f
set my_name [lindex $argv 0]
set my_favorite [lindex $argv 1]
set timeout -1
spawn ./questions
expect "Hello, who are you?\r"
send -- "Im $my_name\r"
expect "Can I ask you some questions?\r"
send -- "Sure\r"
expect "What is your favorite topic?\r"
send -- "$my_favorite\r"
expect eof
Bây giờ cố gắng chạy kịch bản Expect với một số thông số để xem các đầu ra:
$ ./answerbot SomeName Programming
Tuyệt vời!! Bây giờ chúng tôi Expect kịch bản tự động là năng động hơn.
Conditional Tests
Bạn có thể viết có điều kiện thử nghiệm bằng cách sử dụng niềng răng như thế này:
Chúng ta sẽ thay đổi kịch bản của chúng tôi để trở về các điều kiện khác nhau, và chúng tôi sẽ thay đổi kịch bản chúng tôi Expect để xử lý những điều kiện.
Chúng tôi sẽ mô phỏng khác hy vọng với các kịch bản sau đây:
Một số ngẫu nhiên được tạo ra mỗi khi bạn chạy script và dựa trên mà số lượng, chúng tôi đặt một điều kiện để trở lại dự kiến sẽ khác nhau.
Hãy tạo ra kịch bản Expect sẽ đối phó với điều đó.
#!/usr/bin/expect -f
set timeout -1
spawn ./questions
expect {
"*topic?" { send -- "Programming\r" }
"*movie?" { send -- "Star wars\r" }
}
expect eof
Rất rõ ràng. Nếu kịch bản chạm đầu ra chủ đề, kịch bản Expect sẽ gửi chương trình và nếu kịch bản chạm đầu ra bộ phim kịch bản expect sẽ gửi star wars. Không phải là mát mẻ?
If else Conditions
Bạn có thể sử dụng nếu/khác mệnh đề trong hy vọng các kịch bản như thế này:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#!/usr/bin/expect -f
set NUM 1
if { $NUM < 5 } {
puts "\Smaller than 5\n"
} elseif { $NUM > 5 } {
puts "\Bigger than 5\n"
} else {
puts "\Equals 5\n"
}
|
Note: The opening brace must be on the same line.
While Loops
Trong khi vòng trong hy vọng ngôn ngữ phải sử dụng niềng răng để chứa những biểu hiện như thế này:
For Loops
Để làm cho một cho vòng lặp trong hy vọng, ba lĩnh vực phải được xác định, giống như các định dạng sau đây:
User-defined Functions
Bạn có thể xác định một chức năng sử dụng proc như thế này:
Và bạn có thể sử dụng chúng sau đó.
#!/usr/bin/expect -f
proc myfunc { TOTAL } {
set TOTAL [expr $TOTAL + 1]
return "$TOTAL"
}
set NUM 0
while {$NUM <= 5} {
puts "\nNumber $NUM"
set NUM [myfunc $NUM]
}
puts ""
Interact Command
Đôi khi Expect script của bạn có chứa một số thông tin nhạy cảm mà bạn không muốn chia sẻ với những người dùng khác người sử dụng các kịch bản Expect, như mật khẩu hoặc bất kỳ dữ liệu nào khác, vì vậy bạn muốn script của bạn để lấy mật khẩu này từ bạn và tự động hóa tiếp tục bình thường.
Tương tác lệnh reverts điều khiển quay lại bàn phím.
Khi lệnh này được thực thi, Expect sẽ bắt đầu đọc từ bàn phím.
Kịch bản này sẽ hỏi về mật khẩu như hình:
#!/bin/bash
echo "Hello, who are you?"
read $REPLY
echo "What is you password?"
read $REPLY
echo "What is your favorite topic?"
read $REPLY
Bây giờ chúng ta sẽ viết kịch bản Expect sẽ nhắc mật khẩu:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#!/usr/bin/expect -f
set timeout -1
spawn ./questions
expect "Hello, who are you?\r"
send -- "Hi Im Adam\r"
expect "*password?\r"
interact ++ return
send "\r"
expect "*topic?\r"
send -- "Technology\r"
expect eof
|
Sau khi bạn gõ loại mật khẩu của bạn ++ và bộ điều khiển sẽ trở lại trở lại từ bàn phím đến các tập lệnh. Tôi hy vọng bạn bây giờ động với một số khía cạnh quan trọng nhất của Expect lệnh, quyền chỉ huy của autoexpect và làm thế nào để sử dụng nó để tự động hoá công việc của bạn một cách thông minh hơn.
Cảm ơn bạn
Nguồn: likegeeks
0 Comments
Vài lời muốn nói:
* Không được nhận xét thô tục bởi mình biết các bạn là những người văn minh.
* Pass giải nén mặt định là itblognote hoặc itblognote.com nếu có Pass khác thì mình sẽ ghim trong bài viết.
* Click vào quảng cáo và chia sẻ bài viết để mình có thêm động lực viết bài nhé.