Expect 在网络管理中发挥着重要作用
原文鏈接
廢話 可忽略
?
接觸Expect是迫不得已。系統(tǒng)管理員在工作中經(jīng)常會遇到這樣的問題,需要實(shí)現(xiàn)一個(gè)自動交互的工具,這個(gè)工具可以自動Telnet或者Ftp到指定的服務(wù)器上,成功login之后自動執(zhí)行一些命令來完成所需的工作。
當(dāng)然,有很多編程語言可以去解決此類問題,比如用C、Perl、或者Expect。
顯然,盡管C是無所不能的,但是解決此類問題還是比較困難,除非你熟悉Telnet或者Ftp協(xié)議。
曾經(jīng)見過別人用C實(shí)現(xiàn)了一個(gè)簡單的Telnet客戶端協(xié)議的程序,可以在這個(gè)程序加入自己的代碼來捕獲服務(wù)端的輸出,根據(jù)這些輸出來發(fā)送適當(dāng)?shù)闹噶顏磉M(jìn)行遠(yuǎn)程控制。
使用Perl一樣可以實(shí)現(xiàn)這樣的功能,然而,Expect做的更出色,而且除支持Unix/Linux平臺外,它還支持Windows平臺,它就是為系統(tǒng)管理和軟件測試方面的自動交互類需求而產(chǎn)生的
介紹Expect的時(shí)候,不得不說到TCL,畢竟這個(gè)語言是用TCL寫的,于是,其中除了部分的自有命令外,語法也都是TCL的語法,所以在Expect教程里面,將會重點(diǎn)通過一些程序來介紹Expect的功能。
先看一個(gè)最簡單的Expect程序
#!/usr/bin/expect
set timeout 10
spawn telnet 10.80.1.23
expect "login:"
send "user\r"
expect "Password:"
send "123456\r"
expect "%"
puts “Telnet connection established”
對于Expect程序,是可以以tcl后綴名結(jié)尾的,上一個(gè)程序的名字為testTelnet.tcl,且執(zhí)行方法和tcl也一致,直接./testTelnet.tcl即可,但是注意文件的第一行,在TCL程序中,第一行的內(nèi)容為
#!/usr/bin/tclsh
而在這里變?yōu)榱?/p>
#!/usr/bin/expect
?
這個(gè)程序的作用如下,
1.?????????建立一個(gè)到10.80.1.23的telnet連接,由spawn telnet 10.32.17.10來完成,
2.?????????等待屏幕打印login,由expect “l(fā)ogin:”來實(shí)現(xiàn)
3.?????????然后發(fā)送用戶名user,由send “user\r”來完成,其中\(zhòng)r表示在輸入user后按下回車鍵
4.?????????等待屏幕打印Password:,由expect “Password”來實(shí)現(xiàn)
5.?????????發(fā)送密碼123456,同第3步
6.?????????等待登錄成功的提示符%
7.?????????輸出登錄成功消息
這是自動通過telnet登錄的程序,基本上程序中的每句話都被解釋過了,唯一剩下的就是set timeout 10是什么意思呢?
我們可以看到,上面expect都是用來等待某個(gè)結(jié)果出來的,如果這個(gè)結(jié)果一直不出來怎么辦?難道程序一直等下去么?當(dāng)然不是,所以這里就有了timeout,也就是程序如果在等待10s種后沒有得到期望結(jié)果,將會自動退出。如果不設(shè)置timeout的話,expect默認(rèn)的時(shí)間是20s。
而至于spawn,send,expect,這些都是內(nèi)置的expect命令,其中spawn專門用來建立網(wǎng)絡(luò)連接的時(shí)候用的,記住就可以了。
在這里,需要提示的是在使用expect命令等待內(nèi)容的時(shí)候,后面的內(nèi)容一定要是屏幕輸出的最后內(nèi)容。比如上述程序中等到了“l(fā)ogin”,“%”等,都是屏幕輸出的最后,至于為什么,將在以后描述。
?
轉(zhuǎn)載于:https://www.cnblogs.com/wangkangluo1/archive/2012/06/13/2548655.html
總結(jié)
以上是生活随笔為你收集整理的Expect 在网络管理中发挥着重要作用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MSSQL同时操作数据加锁问题
- 下一篇: 【数据库】防止SQL注入