Expect是Linux操作系統(tǒng)下的一個(gè)用來(lái)處理交互操作,系統(tǒng)默認(rèn)是沒(méi)有安裝expect庫(kù),所以執(zhí)行expect會(huì)提示找不到命令,需要手動(dòng)安裝,其它安裝也比較簡(jiǎn)單,可以通過(guò)二進(jìn)制源碼包編譯配置進(jìn)行安裝,也可以通過(guò)網(wǎng)絡(luò)借助yum源來(lái)安裝,yum源安裝比較簡(jiǎn)單;我們下面借助Expect庫(kù)來(lái)實(shí)現(xiàn)Linux交互式自動(dòng)化運(yùn)維操作,只需要執(zhí)行腳本就可以實(shí)現(xiàn)自動(dòng)化運(yùn)維操作,不需要手動(dòng)輸入一些信息按確定,我們可以將交互過(guò)程寫(xiě)在一個(gè)腳本上,使之自動(dòng)化完成。我們可以通過(guò)expect實(shí)現(xiàn)ssh自動(dòng)登錄、ftp自動(dòng)登錄、自動(dòng)傳輸文件、自動(dòng)創(chuàng)建和刪除用戶等都符合交互式自動(dòng)化運(yùn)維。下面我們會(huì)通過(guò)一些案例來(lái)展現(xiàn)結(jié)果,我們通過(guò)以下幾個(gè)命令來(lái)介紹四個(gè)基礎(chǔ)命令。
Linux在企業(yè)中應(yīng)用還是比較廣泛,而且expect是一個(gè)免費(fèi)的編程工具語(yǔ)言,用來(lái)實(shí)現(xiàn)自動(dòng)和交互式任務(wù)進(jìn)行通信,而無(wú)需人的干預(yù)。expect是不斷的更新,隨著時(shí)間的流逝,其功能越來(lái)越強(qiáng)大,對(duì)Linux有基本的了解都知道這個(gè)命令,而且是Linux操作系統(tǒng)管理員必不可少的一個(gè)命令,常用的shell腳本都需要用到這個(gè)工具,可以省去運(yùn)維大量的操作時(shí)間,有利于提高工作效率,如果對(duì)Linux不太了解的可以去購(gòu)物平臺(tái)去搜劉遄老師的《Linux就該這么學(xué)》這本書(shū)學(xué)習(xí),書(shū)籍內(nèi)容比較適合初學(xué)者,也有好多案例比較適合企業(yè)常用的一些操作,expect需要Tcl編程語(yǔ)言的支持,要在系統(tǒng)上運(yùn)行expect必須首先安裝Tcl。
我們通過(guò)yum源來(lái)簡(jiǎn)單的介紹下expect需要安裝哪幾個(gè)庫(kù),如果要通過(guò)二進(jìn)制tar.gz包安裝也可以,需要去下載expect.tar.gz安裝包,這里就不介紹了,操作如下:
# yum installexpect.x86_64 expect-devel.x86_64 -y
下面詳細(xì)的解釋四個(gè)基礎(chǔ)命定,expect中最關(guān)鍵的四個(gè)命令是:send,expect,spawn,interact。
1、send:用于向進(jìn)程發(fā)送字符串;
2、expect:從進(jìn)程接收字符串;
3、spawn:?jiǎn)?dòng)新的進(jìn)程;
4、interact:允許用戶交互;
1. send命令
send命令接收一個(gè)字符串的參數(shù),并且將該參數(shù)發(fā)送到進(jìn)程。
[root@zbox ~]# expect
expect1.1> send "helloworld\n"
hello world
expect1.2>
2. expect命令
expect命令和send命令執(zhí)行的結(jié)果正好相反,expect是用來(lái)等待一個(gè)進(jìn)程的反饋消息,expect可以接收一個(gè)字符串參數(shù),也可以接收正則表達(dá)式參數(shù),一般都是與send命令結(jié)合使用才能看到明細(xì)的效果,下面我們可以用一個(gè)最簡(jiǎn)單的交互式的案例來(lái)展示效果:
expect "hi\n"
send "hello there!\n"
上面兩行代碼的意思是:從標(biāo)準(zhǔn)輸入中等到hi和換行鍵后,向標(biāo)準(zhǔn)輸出輸出hello there。
Expect還有一種最常用的語(yǔ)法是來(lái)自tcl語(yǔ)言的模式-動(dòng)作,這種語(yǔ)法在shell中應(yīng)用極其靈活,使用也非常方便,下面我們就各種語(yǔ)法用案例來(lái)說(shuō)明
expect "hello" {send " hello"}
3. spawn命令
上面的所有案例都是和標(biāo)準(zhǔn)輸入輸出進(jìn)行交互,但是我們更希望他可以和某一個(gè)進(jìn)程進(jìn)行交互。spawm命令就是用來(lái)啟動(dòng)新的進(jìn)程的。spawn后的send和expect命令都是和spawn打開(kāi)的進(jìn)程進(jìn)行交互的。結(jié)合上面的send和expect命令我們可以實(shí)現(xiàn)一個(gè)更復(fù)雜點(diǎn)的shell程序。
# vim test.sh
set timeout -1??????????????????????? //設(shè)置永不超時(shí);
spawn ssh -p 22 root@192.168.3.9???? ??//開(kāi)啟新的進(jìn)程ID,該進(jìn)程的用戶連接遠(yuǎn)程ssh服務(wù)器;
expect "*Password"?????????? ?????????????????? ??//進(jìn)程返回Password時(shí);
send "password\r"????? ???????????? ?//向進(jìn)程輸入password\r,這里是輸入是root用戶的密碼
下面是測(cè)試腳本的結(jié)果:
這段代碼的作用是實(shí)現(xiàn)登錄到ssh服務(wù)器192.168.3.9的root賬號(hào)上,這段shell代碼中用到interact,下面我們就來(lái)詳細(xì)的介紹這個(gè)命定;
4.interact
到現(xiàn)在為止,我們已經(jīng)可以結(jié)合spawn、expect、send自動(dòng)化的完成很多任務(wù)了。但是,如何讓人在適當(dāng)?shù)臅r(shí)候干預(yù)這個(gè)過(guò)程了。比如ssh登錄到服務(wù)器上面要執(zhí)行什么操作,仍然可以停留在ssh服務(wù)器登錄狀態(tài),以便手動(dòng)的執(zhí)行后續(xù)命令。interact可以達(dá)到這些目的。下面的案例是在自動(dòng)登錄ssh服務(wù)器后,允許用戶交互操作。
#!/usr/bin/expect
spawn ssh root@192.168.3.9
expect "*password:"
send "password\r"
spawn sleep 10
interact
exit
這個(gè)案例其實(shí)和上面這個(gè)差不多,但是這個(gè)多了一個(gè)自動(dòng)退出功能,設(shè)置登錄成功10s后自動(dòng)退出。
Expect在shell中也是一個(gè)比較復(fù)雜的庫(kù),如果想深入的了解,自己也要多結(jié)合理論和實(shí)踐操作一起進(jìn)行,這樣學(xué)習(xí)起來(lái)還是比較快的,還可以通過(guò)shell實(shí)現(xiàn)簡(jiǎn)單的控制功能,如:循環(huán)、判斷等。但是對(duì)于需要交互的場(chǎng)合則必須通過(guò)人工來(lái)干預(yù),有時(shí)候我們可能會(huì)需要實(shí)現(xiàn)和交互程序如ssh服務(wù)器等進(jìn)行交互的功能,而expect就使用來(lái)實(shí)現(xiàn)這種功能的工具,希望本文章會(huì)給大家有所幫助。
t