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