email: [email protected]
2023年11月
原文出處: http://blog.csdn.net/yayong
接觸expect是迫不得已。系統管理員在工作中經常會遇到這樣的問題,需要實現乙個自動互動的工具,這個
工具可以自動telnet或者ftp到指定的伺服器上,成功login之後自動執行一些命令來完成所需的工作。
當然,有很多程式語言可以去解決此類問題,比如用c、perl、或者expect。
顯然,儘管c是無所不能的,但是解決此類問題還是比較困難,除非你熟悉telnet或者ftp協議。
曾經見過別人用c實現了乙個簡單的telnet客戶端協議的程式,可以在這個程式加入自己的**來捕獲服務端
的輸出,根據這些輸出來傳送適當的指令來進行遠端控制。
使用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:下面是乙個telnet到指定的遠端機器上自動執行命令的expect指令碼,該指令碼執行時的輸出如下:
# /usr/bin/expect sample_login.exp root 111111
spawn telnet 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
inet 127.0.0.1 netmask ff000000
eri0: flags=1000843mtu 1500 index 2
inet 10.13.22.23 netmask 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 telnet 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 telnet 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
......除錯輸出和程式輸出.......
Expect學習筆記 1
email blog.oliver gmail.2004年11月 原文出處 http blog.csdn.yayong 接觸expect是迫不得已。系統管理員在工作中經常會遇到這樣的問題,需要實現乙個自動互動的工具,這個 工具可以自動tel 或者ftp到指定的伺服器上,成功login之後自動執行一些...
學習筆記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...