中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Linux expect是什么意思

發布時間:2020-11-10 14:20:49 來源:億速云 閱讀:273 作者:小新 欄目:建站服務器

這篇文章將為大家詳細講解有關Linux expect是什么意思,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

隨處可見的expect

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

先拋出一個問題

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

ssh admin@10.220.20.15 "ls"

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

expect是什么?

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

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

expect基礎

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

Linux expect是什么意思

send命令接收一個字符串參數,并將該參數發送到進程。

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

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

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

實用代碼分析

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

#!/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環境后才可以執行的expect內部命令,如果沒有裝expect或者直接在默認的SHELL下執行是找不到spawn命令的。它主要的功能是給ssh運行進程加個殼,用來傳遞交互指令;

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

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

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

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

模式-動作

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

expect {
    "password" {
        send "$password\r"
        exp_continue
    }
    eof
    {
        send "eof"
    }
}

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

傳參

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

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

總結

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

關于Linux expect是什么意思就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

博客| 邻水| 开封县| 江源县| 新郑市| 通山县| 玉门市| 行唐县| 比如县| 杨浦区| 密云县| 连平县| 江西省| 阳城县| 裕民县| 邵阳县| 民乐县| 资源县| 射阳县| 定日县| 庐江县| 白城市| 陕西省| 穆棱市| 嘉兴市| 枣庄市| 郧西县| 西峡县| 灵台县| 崇左市| 新田县| 叙永县| 临桂县| 高安市| 井陉县| 青海省| 绥宁县| 新密市| 巴楚县| 泸州市| 黄骅市|