博客專欄

        EEPW首頁 > 博客 > Linux expect詳解

        Linux expect詳解

        發(fā)布人:電子禪石 時間:2022-11-17 來源:工程師 發(fā)布文章
        Linux命令—— expect: command not found
        原因:主機上沒有安裝expect命令
        檢查:輸入expect check該命令有無安裝
        sudo apt install expect
        Linux expect詳解

        隨處可見的expect

        第一次見expect這個命令還是我第一次參加全量上線的時候,那是公司的一個牛人用Shell腳本寫的一套自動部署、MD5 比對、發(fā)布的全量上線工具,沒事的時候,看了下其中的幾個腳本,好多的expect命令。實在是看不懂這個expect命令的用法,所以就找時間總結(jié)了這篇關(guān)于expect命令的文章。


        先拋出一個問題

        現(xiàn)在有兩臺Linux主機A和B,如何從A主機ssh到B主機,然后在B主機上執(zhí)行命令,如何使這個過程實現(xiàn)全程自動化?你可能會使用這種方法:

        1

        ssh admin@10.220.20.15 "ls"

        但是這種方式比較笨拙,每次都要輸入密碼,同時并不能執(zhí)行一些復雜的邏輯或命令。那么如何實現(xiàn)全程自動化呢?這就要用到今天這篇文章總結(jié)的expect了。

        expect是什么?

        expect是一個免費的編程工具,用來實現(xiàn)自動的交互式任務,而無需人為干預。說白了,expect就是一套用來實現(xiàn)自動交互功能的軟件。

        在實際工作中,我們運行命令、腳本或程序時,這些命令、腳本或程序都需要從終端輸入某些繼續(xù)運行的指令,而這些輸入都需要人為的手工進行。而利用expect,則可以根據(jù)程序的提示,模擬標準輸入提供給程序,從而實現(xiàn)自動化交互執(zhí)行。這就是expect!!!

        expect基礎(chǔ)

        在使用expect時,基本上都是和以下四個命令打交道:

        6d5bdd3ff90f4a5dd89000237374594.png

        send命令接收一個字符串參數(shù),并將該參數(shù)發(fā)送到進程。

        expect命令和send命令相反,expect通常用來等待一個進程的反饋,我們根據(jù)進程的反饋,再發(fā)送對應的交互命令。

        spawn命令用來啟動新的進程,spawn后的send和expect命令都是和使用spawn打開的進程進行交互。

        interact命令用的其實不是很多,一般情況下使用spawn、send和expect命令就可以很好的完成我們的任務;但在一些特殊場合下還是需要使用interact命令的,interact命令主要用于退出自動化,進入人工交互。比如我們使用spawn、send和expect命令完成了ftp登陸主機,執(zhí)行下載文件任務,但是我們希望在文件下載結(jié)束以后,仍然可以停留在ftp命令行狀態(tài),以便手動的執(zhí)行后續(xù)命令,此時使用interact命令就可以很好的完成這個任務。

        實用代碼分析

        上面對expect進行了總結(jié),特別是對一些常用的命令進行了詳細的說明。下面就通過一些常用的expect腳本來具體的說明如何使用expect來完成日常的一些工作。

        1

        2

        3

        4

        5

        6

        7

        8

        #!/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

        這是一段非常簡單的expect示例代碼,演示了expect的基本使用方法。

        #!/usr/tcl/bin/expect:使用expect來解釋該腳本;

        set timeout 30:設置超時時間,單位為秒,默認情況下是10秒;

        set host "101.200.241.109":設置變量;

        spawn ssh $username@$host:spawn是進入expect環(huán)境后才可以執(zhí)行的expect內(nèi)部命令,如果沒有裝expect或者直接在默認的SHELL下執(zhí)行是找不到spawn命令的。它主要的功能是給ssh運行進程加個殼,用來傳遞交互指令;

        expect "*password*":這里的expect也是expect的一個內(nèi)部命令,這個命令的意思是判斷上次輸出結(jié)果里是否包含“password”的字符串,如果有則立即返回;否則就等待一段時間后返回,這里等待時長就是前面設置的30秒;

        send "$password\r":當匹配到對應的輸出結(jié)果時,就發(fā)送密碼到打開的ssh進程,執(zhí)行交互動作;

        interact:執(zhí)行完成后保持交互狀態(tài),把控制權(quán)交給控制臺,這個時候就可以手工操作了。如果沒有這一句登錄完成后會退出,而不是留在遠程終端上。

        這就是對上述這段簡單簡單腳本的分析,在上述的示例中,涉及到expect中一個非常重要的概念——模式-動作;即上述expect "*password*" {send "$password\r"}這句代碼表達出來的含義。

        模式-動作

        結(jié)合著expect "*password*" {send "$password\r"}這句代碼來說說“模式-動作”。簡單的說就是匹配到一個模式,就執(zhí)行對應的動作;匹配到password字符串,就輸入密碼。你可能也會看到這樣的代碼:

        1

        2

        3

        4

        5

        6

        7

        8

        9

        10

        expect {

            "password" {

                send "$password\r"

                exp_continue

            }

            eof

            {

                send "eof"

            }

        }

        其中exp_continue表示循環(huán)式匹配,通常匹配之后都會退出語句,但如果有exp_continue則可以不斷循環(huán)匹配,輸入多條命令,簡化寫法。

        傳參

        很多時候,我們需要傳遞參數(shù)到腳本中,現(xiàn)在通過下面這段代碼來看看如何在expect中使用參數(shù):

        1

        2

        3

        4

        5

        6

        7

        8

        9

        10

        11

        12

        #!/usr/tcl/bin/expect

        if {$argc < 3} {

            puts "Usage:cmd <host> <username> <password>"

            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ù)個數(shù),而參數(shù)值存放在$argv中,比如取第一個參數(shù)就是[lindex $argv 0],以此類推。

        總結(jié)

        能夠在工作中熟練的使用Shell腳本就可以很大程度的提高工作效率,如果再搭配上expect,那么很多工作都可以自動化進行,對工作的展開如虎添翼。如果你會Python的話,你的視野將會更加開闊,那個時候你又會“嫌棄”expect了。


        *博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。



        關(guān)鍵詞: linux

        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 台安县| 若尔盖县| 浮梁县| 稻城县| 荥阳市| 绍兴县| 道孚县| 汕头市| 都江堰市| 高平市| 阜城县| 泉州市| 临邑县| 平武县| 思茅市| 富宁县| 龙里县| 县级市| 三江| 泾源县| 绥德县| 阳江市| 当阳市| 南通市| 咸阳市| 博罗县| 孙吴县| 达孜县| 安平县| 贵港市| 唐海县| 德安县| 陕西省| 邢台市| 沈丘县| 荔波县| 贺兰县| 军事| 满洲里市| 沂水县| 鹤壁市|