這篇文章將為大家詳細(xì)講解有關(guān)Linux expect是什么意思,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
為嶗山等地區(qū)用戶(hù)提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及嶗山網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、嶗山網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專(zhuān)業(yè)、用心的態(tài)度為用戶(hù)提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶(hù)的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!隨處可見(jiàn)的expect
第一次見(jiàn)expect這個(gè)命令還是我第一次參加全量上線的時(shí)候,那是公司的一個(gè)牛人用Shell腳本寫(xiě)的一套自動(dòng)部署、MD5 比對(duì)、發(fā)布的全量上線工具,沒(méi)事的時(shí)候,看了下其中的幾個(gè)腳本,好多的expect命令。實(shí)在是看不懂這個(gè)expect命令的用法,所以就找時(shí)間總結(jié)了這篇關(guān)于expect命令的文章。
先拋出一個(gè)問(wèn)題
現(xiàn)在有兩臺(tái)Linux主機(jī)A和B,如何從A主機(jī)ssh到B主機(jī),然后在B主機(jī)上執(zhí)行命令,如何使這個(gè)過(guò)程實(shí)現(xiàn)全程自動(dòng)化?你可能會(huì)使用這種方法:
ssh admin@10.220.20.15 "ls"
但是這種方式比較笨拙,每次都要輸入密碼,同時(shí)并不能執(zhí)行一些復(fù)雜的邏輯或命令。那么如何實(shí)現(xiàn)全程自動(dòng)化呢?這就要用到今天這篇文章總結(jié)的expect了。
expect是什么?
expect是一個(gè)免費(fèi)的編程工具,用來(lái)實(shí)現(xiàn)自動(dòng)的交互式任務(wù),而無(wú)需人為干預(yù)。說(shuō)白了,expect就是一套用來(lái)實(shí)現(xiàn)自動(dòng)交互功能的軟件。
在實(shí)際工作中,我們運(yùn)行命令、腳本或程序時(shí),這些命令、腳本或程序都需要從終端輸入某些繼續(xù)運(yùn)行的指令,而這些輸入都需要人為的手工進(jìn)行。而利用expect,則可以根據(jù)程序的提示,模擬標(biāo)準(zhǔn)輸入提供給程序,從而實(shí)現(xiàn)自動(dòng)化交互執(zhí)行。這就是expect?。?!
expect基礎(chǔ)
在使用expect時(shí),基本上都是和以下四個(gè)命令打交道:
send命令接收一個(gè)字符串參數(shù),并將該參數(shù)發(fā)送到進(jìn)程。
expect命令和send命令相反,expect通常用來(lái)等待一個(gè)進(jìn)程的反饋,我們根據(jù)進(jìn)程的反饋,再發(fā)送對(duì)應(yīng)的交互命令。
spawn命令用來(lái)啟動(dòng)新的進(jìn)程,spawn后的send和expect命令都是和使用spawn打開(kāi)的進(jìn)程進(jìn)行交互。
interact命令用的其實(shí)不是很多,一般情況下使用spawn、send和expect命令就可以很好的完成我們的任務(wù);但在一些特殊場(chǎng)合下還是需要使用interact命令的,interact命令主要用于退出自動(dòng)化,進(jìn)入人工交互。比如我們使用spawn、send和expect命令完成了ftp登陸主機(jī),執(zhí)行下載文件任務(wù),但是我們希望在文件下載結(jié)束以后,仍然可以停留在ftp命令行狀態(tài),以便手動(dòng)的執(zhí)行后續(xù)命令,此時(shí)使用interact命令就可以很好的完成這個(gè)任務(wù)。
實(shí)用代碼分析
上面對(duì)expect進(jìn)行了總結(jié),特別是對(duì)一些常用的命令進(jìn)行了詳細(xì)的說(shuō)明。下面就通過(guò)一些常用的expect腳本來(lái)具體的說(shuō)明如何使用expect來(lái)完成日常的一些工作。
#!/usr/tcl/bin/expect set timeout 30 set host "101.200.241.109" set username "root" set password "123456" spawn ssh $username@$host expect "*password*" {send "$password\r"} interact
這是一段非常簡(jiǎn)單的expect示例代碼,演示了expect的基本使用方法。
#!/usr/tcl/bin/expect:使用expect來(lái)解釋該腳本;
set timeout 30:設(shè)置超時(shí)時(shí)間,單位為秒,默認(rèn)情況下是10秒;
set host "101.200.241.109":設(shè)置變量;
spawn ssh $username@$host:spawn是進(jìn)入expect環(huán)境后才可以執(zhí)行的expect內(nèi)部命令,如果沒(méi)有裝expect或者直接在默認(rèn)的SHELL下執(zhí)行是找不到spawn命令的。它主要的功能是給ssh運(yùn)行進(jìn)程加個(gè)殼,用來(lái)傳遞交互指令;
expect "*password*":這里的expect也是expect的一個(gè)內(nèi)部命令,這個(gè)命令的意思是判斷上次輸出結(jié)果里是否包含“password”的字符串,如果有則立即返回;否則就等待一段時(shí)間后返回,這里等待時(shí)長(zhǎng)就是前面設(shè)置的30秒;
send "$password\r":當(dāng)匹配到對(duì)應(yīng)的輸出結(jié)果時(shí),就發(fā)送密碼到打開(kāi)的ssh進(jìn)程,執(zhí)行交互動(dòng)作;
interact:執(zhí)行完成后保持交互狀態(tài),把控制權(quán)交給控制臺(tái),這個(gè)時(shí)候就可以手工操作了。如果沒(méi)有這一句登錄完成后會(huì)退出,而不是留在遠(yuǎn)程終端上。
這就是對(duì)上述這段簡(jiǎn)單簡(jiǎn)單腳本的分析,在上述的示例中,涉及到expect中一個(gè)非常重要的概念——模式-動(dòng)作;即上述expect "*password*" {send "$password\r"}這句代碼表達(dá)出來(lái)的含義。
模式-動(dòng)作
結(jié)合著expect "*password*" {send "$password\r"}這句代碼來(lái)說(shuō)說(shuō)“模式-動(dòng)作”。簡(jiǎn)單的說(shuō)就是匹配到一個(gè)模式,就執(zhí)行對(duì)應(yīng)的動(dòng)作;匹配到password字符串,就輸入密碼。你可能也會(huì)看到這樣的代碼:
expect { "password" { send "$password\r" exp_continue } eof { send "eof" } }
其中exp_continue表示循環(huán)式匹配,通常匹配之后都會(huì)退出語(yǔ)句,但如果有exp_continue則可以不斷循環(huán)匹配,輸入多條命令,簡(jiǎn)化寫(xiě)法。
傳參
很多時(shí)候,我們需要傳遞參數(shù)到腳本中,現(xiàn)在通過(guò)下面這段代碼來(lái)看看如何在expect中使用參數(shù):
#!/usr/tcl/bin/expect if {$argc < 3} { puts "Usage:cmd" exit 1 } set timeout -1 set host [lindex $argv 0] set username [lindex $argv 1] set password [lindex $argv 2] spawn ssh $username@$host expect "*password*" {send "$password\r"} interact
在expect中,\$argc表示參數(shù)個(gè)數(shù),而參數(shù)值存放在$argv中,比如取第一個(gè)參數(shù)就是[lindex $argv 0],以此類(lèi)推。
總結(jié)
能夠在工作中熟練的使用Shell腳本就可以很大程度的提高工作效率,如果再搭配上expect,那么很多工作都可以自動(dòng)化進(jìn)行,對(duì)工作的展開(kāi)如虎添翼。如果你會(huì)Python的話,你的視野將會(huì)更加開(kāi)闊,那個(gè)時(shí)候你又會(huì)“嫌棄”expect了。
關(guān)于Linux expect是什么意思就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。