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