Expect學習筆記 1

2021-03-31 08:56:57 字數 3418 閱讀 5719

email: blog.oliver@gmail.***

2023年11月

原文出處: http://blog.csdn.***/yayong

接觸expect是迫不得已。系統管理員在工作中經常會遇到這樣的問題,需要實現乙個自動互動的工具,這個

工具可以自動tel***或者ftp到指定的伺服器上,成功login之後自動執行一些命令來完成所需的工作。

當然,有很多程式語言可以去解決此類問題,比如用c、perl、或者expect。

顯然,儘管c是無所不能的,但是解決此類問題還是比較困難,除非你熟悉tel***或者ftp協議。

曾經見過別人用c實現了乙個簡單的tel***客戶端協議的程式,可以在這個程式加入自己的**來捕獲服務端

的輸出,根據這些輸出來傳送適當的指令來進行遠端控制。

使用perl一樣可以實現這樣的功能,然而,expect做的更出色,而且除支援

unix/linux平台外,它還支援

windows

平台,它就是為系統管理和軟體測試方面的自動互動類需求而產生的:

expect是乙個免費的程式設計工具語言,用來實現自動和互動式任務進行通訊,而無需人的干預。

expect的作者don libes在2023年開始編寫expect時對expect做有如下定義:

expect是乙個用來實現自動互動功能的軟體套件(expect [is a] software suite for automating interactive tools)。

expect語言是基於tcl的

, 作為一種指令碼語言,tcl具有簡單的語法:      

cmd arg arg arg 

一條tcl命令由空格分割的單詞組成. 其中, 第乙個單詞是命令名稱, 其餘的是命令引數 . 

$foo 

$符號代表變數的值. 在本例中, 變數名稱是foo. 

[cmd arg] 

方括號執行了乙個巢狀命令. 例如, 如果你想傳遞乙個命令的結果作為另外乙個命令的引數, 那麼你使用這個符號 .

"some stuff"

雙引號把片語標記為命令的乙個引數. "$"符號和方括號在雙引號內仍被解釋 . 

大括號也把片語標記為命令的乙個引數. 但是, 其他符號在大括號內不被解釋. 

/ 反斜線符號(/) 是用來引用特殊符號. 例如:/n 代表換行. 反斜線符號也被用來關閉"$"符號 , 引號,方括號和大括號的特殊含義 .

最好的學習方法就是邊乾邊學,對於已經熟悉一種程式語言的人來說,用另一種新的語言來寫程式解決問題,是很

容易的事。所以大概了解一下基本語法後,就一邊動手解決問題,一邊查手冊吧。

關於tcl和expect的語法,請參考

unix/linux 平台任務的自動化相關部分。

例1:下面是乙個tel***到指定的遠端機器上自動執行命令的expect指令碼,該指令碼執行時的輸出如下:

# /usr/bin/expect sample_login.exp root 111111

spawn tel*** 10.13.32.30 7001

trying 10.13.32.30...

connected to 10.13.32.30.

escape character is '^]'.

accho console login: root

password:

last login: sat nov 13 17:01:37 on console

sun microsystems inc.   sunos 5.9  may 2004

# login successfully...

# uname -p

sparc

# ifconfig -a

lo0: flags=2001000849mtu 8232 index 1

i*** 127.0.0.1 ***mask ff000000

eri0: flags=1000843mtu 1500 index 2

i*** 10.13.22.23 ***mask ffffff00 broadcast 10.13.22.255

ether 0:3:ba:4e:4a:aa

# exit

accho console login:

finished...

下面是該指令碼的源**:

# vi sample_login.exp:

proc do_console_login

"password:"

"#"

timeout

1 2

}incr timeout_case}}

}}

proc do_exec_cmd {}

if

set login   [lindex $argv 0]

set pass    [lindex $argv 1]

spawn tel*** 10.13.32.30  7001

do_console_login $login $pass

do_exec_cmd

close

exit 0

上面的指令碼只是乙個示例,實際工作中,只需要重新實現

do_exec_cmd函式就可以解決類似問題了。

在例1中,還可以學習到以下tcl的語法:

1. 命令列引數

$argc,

$argv 0,

$argv 1 ...

$argv n

if

2. 輸入輸出

puts stderr "usage: $argv0 login passwaord./n "

3. 巢狀命令

set login   [lindex $argv 0]

set pass    [lindex $argv 1]

4. 命令呼叫        

spawn tel*** 10.13.32.30  7001

5. 函式定義和呼叫

proc do_console_login

6. 變數賦值

set done 1

7. 迴圈

while ($done)

8. 條件分支

switch

switch -- $timeout_case

1 2

}9. 運算

incr timeout_case

此外,還可以看到 expect的以下命令:

send

expect

send_user

可以通過-d引數除錯expect指令碼:

# /usr/bin/expect -d sample_login.exp root 111111

......除錯輸出和程式輸出.......

參考文件:

unix/linux 平台任務的自動化

expect 教程中文版

Expect學習筆記 1

email blog.oliver gmail.com 2004年11月 原文出處 http blog.csdn.net yayong 接觸expect是迫不得已。系統管理員在工作中經常會遇到這樣的問題,需要實現乙個自動互動的工具,這個 工具可以自動telnet或者ftp到指定的伺服器上,成功log...

學習筆記1

struct test test int x void fun class test1 test1 int x void fun int main void test1 a 行1 a.fun 行2 test1 b 行3 b.fun 行4 test c 行5 c.fun 行6 test d 行7 d....

學習筆記1

1 字串原地逆序 使用臨時變數 void reverse string s 5 求平均值 避免溢位 int f int x,int y 6 楊氏矩陣 bool young int a m n int x return false 7 十進位制轉十六進製制 string decimaltohexade...