Expect是一個linux內部命令了Expect被廣泛應用于交互式操作和自動化測試的場景之中,下面我們來看看小編整理的一篇關于expect命令例子。
前言
前段時間將工作用的機器換成了 Ubuntu + 128G SSD + 8G內存的臺式機,終于走上了用linux辦公的道路,總的說來,Ubuntu用起來還是比我想象的順暢得多,其“apt-get式”的包管理方式,安裝軟件非常方便,apt-get install xxx 即可安裝。唯一的缺點就是銀行的“U盾”等不支持linux,所以,使用網銀時略有不便。
言歸正傳,在換臺式后公司還做了一件事就是統一了公司內的測試環境,將所有的測試環境機器統一到機房內用虛擬機的方式統一管理(皆大歡喜)。為了以后開發測試方便,項目組申請了多套測試環境,比如:開發環境:用于開發人員每次迭代自測時的環境。測試環境:穩定的和線上代碼同步的測試環境,通常用于演示或者對測試環境其他應用提供服務。除此以外,還有一套性能測試環境。這么多環境的問題就導致,每次需要更新環境:update 代碼,重啟tomcat時都需要ssh到某臺機器上。這其實是一個浪費時間的重復性勞動,通常情況,這種事情都可以使用代碼解決。這就是我們今天的主角:expect。
Expect詳解
expect命令簡單說就是通過其內置的各種命令實現在交互式軟件中自動交互的工具。wiki:http://zh.wikipedia.org/zh/Expect
用在ssh時,可以配合spawn命令實現ssh的自動登錄。又因為可以在腳本中編寫判斷,賦值等邏輯,具有很高的靈活性。
demo實例如下:
- #!/usr/bin/expect -f ##聲明使用哪種解析器解析該腳本,如果沒有安裝expect的話,使用apt-get install expect安裝
- if { [llength $argv] < 1 } { ##$argv為執行該腳本是的參數數組,判斷長度,以決定是否繼續
- puts "Usage: $argv0 need ssh ip" //expect中的echo,System.out.println()
- exit 1
- }
- set envs [lindex $argv 0] ##將數組中的第一個參數賦值給 envs
- set timeout 30 //設置等待終端響應的超時時間為30秒
- if { $envs == 61 } { ##注意 if和{間有個空格,{和$envs間有個空格,等號前后有空格,61后有空格,}{間有空格!!!
- set ips xxx.xx.xxx.61
- }
- if { $envs == 141 } {
- set ips xxx.xx.xxx.141
- }
- if { $envs == 136 } {
- set ips xxx.xx.xxx.136
- }
- spawn ssh root@$ips ##執行ssh命令實現登陸
- expect {
- //Vevb.com
- ##第一次登陸的時候,會詢問是否有在本地保存該密鑰,仔細的你應該發現,這里的匹配是用正則的,簡答說,只匹配connecting也是可以的。
- "Are you sure you want to continue connecting (yes/no)?" {send "yes/r"}
- "password:" {send "cdyanfa/r"}##保存過一次后,就會直接返回需要密碼的階段了。使用send 命令發送密碼。
- }
interact ##是Expect用來打開用戶與產生進程之間通信的命令,簡單說就是登陸以后將遠程服務器的終端保持在當前終端,而不是將遠程終端關掉.
短短幾行命令就將每天重復N次的操作簡化成一行了,對于提高效率很有用.
|
新聞熱點
疑難解答