"
set給 Expect 腳本中的變量賦值set username “joe”
expect等待進程收到的遠程主機的輸出,并匹配對應(yīng)的字符串 , 一旦匹配,執(zhí)行后續(xù)的操作expect { "yes/no" send "yes" ;}
Expect 還能理解一些特殊情況,如超時和遇到文件尾。 :set timeout 60 ;expect eof
我們以上述的實例作為例子,來看看 Expert 腳本如何實現(xiàn)自動化登陸并 sudo 到 root,然后搬移文件的功能。
Expect 腳本 autoMove 示例如下:
清單 3. autoMove.sh 腳本示例
#!/usr/bin/expect
# 導(dǎo)入 Expect 類庫
set hostname [lindex $argv 0]
# 設(shè)置操作的遠程主機,$argv 類似 Shell 函數(shù)中的接收參數(shù) [lindex $argv 0]
# 則表示第一個接收參數(shù) , 例如 expectExample.sh host1
set username [lindex $argv 1]
# 同上,第二個接收參數(shù)為登陸用戶名
set passwd [lindex $argv 2]
# 同上,第三個接收參數(shù)為登陸用戶密碼
set timeout 60
# 設(shè)置等待超時為 60 秒
spawn ssh $username@$hostname
# 使用 spawn 命令來激活 ssh 程序,模擬終端的輸出將能夠被 Expect 所讀取,模擬終端也能從 send 輸入到遠程主機
expect {
"yes/no" {send "yes ";exp_continue}
"Password:" {send "$passwd ";}
}
#Expect 語句等待遠程主機的字符串匹配,當(dāng)匹配到了“yes/no”
#則執(zhí)行后面的操作 .expect 搜索模式"*password:",其中 * 允許匹配
# 任意輸入,所以對于避免指定所有細節(jié)而言是非常有效的。如果遠程主機沒有 action,
#所以 Expect 檢測到該模式后就繼續(xù)運行。 一旦接收到提示后,下一行就就把密碼送給當(dāng)前進程。
send "sudo -s
"
expect "Password:" {send "$newpasswd
"}
# 執(zhí)行 sudo 用戶角色轉(zhuǎn)換操作
send "copy /etc/sudoers /usr/local/etcsudoers
"
# 執(zhí)行實際運維操作
send "exit
"
send "exit
"
expect eof {exit 1}
由上我們可以看出 Expect 使用偽終端來和派生的進程相聯(lián)系。偽終端提供了終端語義以便程序認為他們正在和真正的終端進行 I/O 操作。使用 Expect 等待遠程主機的響應(yīng)并匹配需要的字符串,當(dāng)匹配到后執(zhí)行 send 操作向遠程主機發(fā)送命令,set 操作為賦值,腳本的編寫于通常的 Shell 腳本很類似,相當(dāng)簡潔和實用。
在 AIX ,Solairs 的 Unix 平臺環(huán)境下 Expect 是默認安裝的,Linux 需要安裝對應(yīng)的 rpm 包。
總結(jié)和展望
以上分析了大型企業(yè)服務(wù)器的自動化腳本運維,通過不同的案例分別介紹了 shell 管道,Java SSHD 開源包和 Expect 腳本三種方式的自動化運維。三種方式針對不同的業(yè)務(wù)需求及客戶服務(wù)器實際環(huán)境,有很強的實用性和操作性。可以滿足絕大多數(shù)企業(yè)服務(wù)主機的自動化運維工作內(nèi)容,三種方式的代碼示例稍作修改,即可直接用于實際的生產(chǎn)主機日常運維工作中。
如今隨著 IT 運維管理工作的復(fù)雜度和難度的大大增加,將純粹的人工操作變?yōu)橐欢ǔ潭鹊淖詣踊芾硎且粋€必然趨勢。未來的 IT 自動化運維必將更加專業(yè)化、標(biāo)準(zhǔn)化和流程化。通過自動化運維監(jiān)控,系統(tǒng)能及時發(fā)現(xiàn)故障隱患,主動的告訴用戶需要關(guān)注的資源,以達到防患于未然。通過自動化運維診斷,能最大限度地減少維修時間,提高服務(wù)質(zhì)量。