首頁 運維 linux運維 Linux expect詳解

Linux expect詳解

Aug 09, 2019 pm 02:22 PM
linux

Linux expect詳解

隨處可見的expect

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

推薦:【Linux影片教學

先拋出一個問題

現在有兩台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詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何解決Linux終端中查看Python版本時遇到的權限問題? 如何解決Linux終端中查看Python版本時遇到的權限問題? Apr 01, 2025 pm 05:09 PM

Linux終端中查看Python版本時遇到權限問題的解決方法當你在Linux終端中嘗試查看Python的版本時,輸入python...

在Docker環境中使用PECL安裝擴展時為什麼會報錯?如何解決? 在Docker環境中使用PECL安裝擴展時為什麼會報錯?如何解決? Apr 01, 2025 pm 03:06 PM

在Docker環境中使用PECL安裝擴展時報錯的原因及解決方法在使用Docker環境時,我們常常會遇到一些令人頭疼的問�...

如何在LAMP架構下高效整合Node.js或Python服務? 如何在LAMP架構下高效整合Node.js或Python服務? Apr 01, 2025 pm 02:48 PM

在LAMP架構下整合Node.js或Python服務許多網站開發者都面臨這樣的問題:已有的LAMP(Linux Apache MySQL PHP)架構網站需要...

在Linux終端中使用python --version命令時如何解決權限問題? 在Linux終端中使用python --version命令時如何解決權限問題? Apr 02, 2025 am 06:36 AM

Linux終端中使用python...

如何在macOS上將apscheduler定時任務配置為服務? 如何在macOS上將apscheduler定時任務配置為服務? Apr 01, 2025 pm 06:09 PM

在macOS上將apscheduler定時任務配置為服務在macOS平台上,如果你想將apscheduler定時任務配置為一個服務,類似於ngin...

Linux系統自帶Python解釋器能刪除嗎? Linux系統自帶Python解釋器能刪除嗎? Apr 02, 2025 am 07:00 AM

關於Linux系統自帶Python解釋器的刪除問題許多Linux發行版在安裝時會預裝Python解釋器,它並非通過軟件包管理器�...

c語言多線程的四種實現方式 c語言多線程的四種實現方式 Apr 03, 2025 pm 03:00 PM

語言多線程可以大大提升程序效率,C 語言中多線程的實現方式主要有四種:創建獨立進程:創建多個獨立運行的進程,每個進程擁有自己的內存空間。偽多線程:在一個進程中創建多個執行流,這些執行流共享同一內存空間,並交替執行。多線程庫:使用pthreads等多線程庫創建和管理線程,提供了豐富的線程操作函數。協程:一種輕量級的多線程實現,將任務劃分成小的子任務,輪流執行。

web.xml怎麼打開 web.xml怎麼打開 Apr 03, 2025 am 06:51 AM

要打開 web.xml 文件,可以使用以下方法:使用文本編輯器(如記事本或 TextEdit)使用集成開發環境(如 Eclipse 或 NetBeans)使用命令行編輯命令(Windows:notepad web.xml;Mac/Linux:open -a TextEdit web.xml)

See all articles