實例講解expect指令實現Shell自動化交互
本文我們將實例講解expect指令實現Shell自動化交互,我們透過Shell可以實現簡單的控制流功能,如:循環、判斷等。以下這篇文章主要為大家介紹了關於利用expect指令實現Shell自動化互動的相關資料,文中透過範例程式碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
背景
linux腳本中有很多場景是進行遠端操作的,例如遠端登入ssh、遠端複製scp、檔案傳輸sftp等。這些命令中都會涉及安全密碼的輸入,正常使用命令時是需要人工手動輸入密碼並接受安全驗證的。為了實現自動化遠端操作,我們可以藉用expect的功能。
expect是一個免費的程式設計工具語言,用來實現自動和互動式任務進行通信,而無需人的干預。 expect是不斷發展的,隨著時間的流逝,其功能越來越強大,已經成為系統管理員的一個強大助手。 expect需要Tcl程式語言的支持,要在系統上運行expect必須先安裝Tcl。
expect的安裝
expect是在Tcl基礎上創建起來的,所以在安裝expect前我們應該先安裝Tcl。
(一)Tcl 安裝
主頁: http://www.tcl.tk
下載位址: http://www.tcl .tk/software/tcltk/downloadnow84.tml
1.下載原始碼套件
wget http://nchc.dl.sourceforge.net/sourceforge/tcl/tcl8.4.11-src.tar.gz
2.解壓縮原始碼套件
tar xfvz tcl8.4.11-src.tar.gz
3.安裝設定
cd tcl8.4.11/unix ./configure --prefix=/usr/tcl --enable-shared make make install
注意:
1、安裝完畢以後,進入tcl原始碼的根目錄,把子目錄unix下面的tclUnixPort.h copy到子目錄generic。
2、暫時不要刪除tcl原始碼,因為expect的安裝過程還需要用。
(二)expect 安裝(需Tcl的庫)
主頁: http://expect.nist.gov/
1.下載原始碼套件
wget http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz/download
2.解壓縮原始碼套件
tar xzvf expect5.45.tar.gz
3.安裝設定
cd expect5.45 ./configure --prefix=/usr/expect --with-tcl=/usr/tcl/lib --with-tclinclude=../tcl8.4.11/generic make make install ln -s /usr/tcl/bin/expect /usr/expect/bin/expect
expect
expect的核心是spawn、expect 、send、set。
spawn 呼叫要執行的指令
expect 等待指令提示訊息的出現,也就是捕捉使用者輸入的提示:
send 傳送需要互動的值,取代了使用者手動輸入內容
#set 設定變數值
interact 執行完成後保持互動狀態,把控制權交給控制台,這個時候就可以手動操作了。如果沒有這一句登入完成後會退出,而不是留在遠端終端上。
expect eof 這個一定要加,與spawn對應表示捕獲終端輸出資訊終止,類似if....endif
expect腳本必須以interact或expect eof結束,執行自動化任務通常expect eof就夠了。
其他設定
設定expect永不逾時set timeout -1
設定expect 300秒逾時,如果超過300沒有expect內容出現,退出set timeout 300
#expect寫語法
expect使用的是tcl語法
一條Tcl指令由空格分割的單字組成. 其中, 第一個單字是指令名稱, 其餘的是指令參數
cmd arg arg arg$符號代表變數的值. 在本例中, 變數名稱是foo.
$foo方括號執行了一個巢狀指令. 例如,如果你想傳遞一個命令的結果作為另外一個命令的參數, 那麼你使用這個符號
[cmd arg]#雙引號把詞組標記為命令的一個參數. "$"符號和方括號在雙引號內仍被解釋
"some stuff"#大括號也把詞組標記為命令的一個參數. 但是, 其他符號在大括號內不被解釋
{some stuff}反斜線符號是用來引用特殊符號. 例如:n 代表換行. 反斜線符號也被用來關閉"$"符號, 引號,方括號和大括號的特殊意義
#範例
login.exp專用於遠端登錄,快捷使用方式: login.exp "exclude" "${remote_ip}" "${remote_user}" "${remote_passwd}" "${remote_command}"
#!/usr/bin/expect -f ########################################################## # 通过SSH登陆和执行命令 #参数:1.Use_Type [check/execute] # 2.SSHServerIp # 3.SSHUser # 4.SSHPassword # 5.CommandList [多个命令间以;间隔] #返回值: # 0 成功 # 1 参数个数不正确 # 2 SSH 服务器服务没有打开 # 3 SSH 用户密码不正确 # 4 连接SSH服务器超时 ########################################################## proc usage {} { regsub ".*/" $::argv0 "" name send_user "Usage:\n" send_user " $name Use_Type SSHServerIp SSHUser SSHPassword CommandList\n" exit 1 } ## 判断参数个数 if {[llength $argv] != 5} { usage } #设置变量值 set Use_Type [lindex $argv 0] set SSHServerIp [lindex $argv 1] set SSHUser [lindex $argv 2] set SSHPassword [lindex $argv 3] set CommandList [lindex $argv 4] #spawn ping ${SSHServerIp} -w 5 #expect { # -nocase -re "100% packet loss" { # send_error "Ping ${SSHServerIp} is unreachable, Please check the IP address.\n" # exit 1 # } #} set timeout 360 set resssh 0 #定义变量标记ssh连接时是否输入yes确认 set inputYes 0 set ok_string LOGIN_SUCCESS if {$Use_Type=="check"} { #激活ssh连接,如果要需要输入yes确认,输入yes,设置inputYes为1,否则输入ssh密码 spawn ssh ${SSHUser}@${SSHServerIp} "echo $ok_string" } else { spawn ssh ${SSHUser}@${SSHServerIp} "$CommandList" } expect { -nocase -re "yes/no" { send -- "yes\n" set inputYes 1 } -nocase -re "assword: " { send -- "${SSHPassword}\n" set resssh 1 } #-nocase -re "Last login: " { # send -- "${CommandList}\n" #} $ok_string {} -nocase -re "Connection refused" { send_error "SSH services at ${SSHServerIp} is not active.\n" exit 2 } timeout { send_error "Connect to SSH server ${SSHUser}@${SSHServerIp} timeout(10s).\n" exit 4 } } #如果输入了yes确认,输入ssh密码 if {$inputYes==1} { expect { -nocase -re "assword: " { send -- "${SSHPassword}\n" set resssh 1 } } } #如果出现try again或者password:提示,说明输入的用户密码错误,直接退出。 if {$resssh==1} { expect { -nocase -re "try again" { send_error "SSH user:${SSHUser} passwd error.\n" exit 3 } -nocase -re "assword:" { send_error "SSH user:${SSHUser} passwd error.\n" exit 3 } eof {} } } send_error -- "$expect_out(buffer)" #-nocase -re "No such user" { # send_error "No such user.\n" # exit 5 # } #exit
大家學會了嗎?希望學完本文之後大家對shell自動化互動有更深的掌握。
相關推薦:
以上是實例講解expect指令實現Shell自動化交互的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

透過sudo指令,使用者可以在提升權限模式下執行指令,而無需切換到超級使用者模式。本文將介紹如何在Windows系統中模擬類似sudo指令的功能。什麼是數道司令部? Sudo(「超級使用者do」的縮寫)是一種命令列工具,允許基於Unix的作業系統(如Linux和MacOS)的使用者以提升的權限執行命令,這些權限通常是管理員所擁有的。在Windows11/10中執行SUDO命令然而,隨著最新發布的Windows11Insider預覽版推出,Windows用戶現在也可以體驗到這項功能。這項新功能使用戶能夠

華為手機如何實現雙微信登入?隨著社群媒體的興起,微信已成為人們日常生活中不可或缺的溝通工具之一。然而,許多人可能會遇到一個問題:在同一部手機上同時登入多個微信帳號。對於華為手機用戶來說,實現雙微信登入並不困難,本文將介紹華為手機如何實現雙微信登入的方法。首先,華為手機自帶的EMUI系統提供了一個很方便的功能-應用程式雙開。透過應用程式雙開功能,用戶可以在手機上同

本文將向讀者介紹在Win11系統中如何使用命令提示字元(CommandPrompt)來尋找網路介面卡的實體位址(MAC位址)。 MAC位址是網路介面卡(NIC)的唯一標識符,它在網路通訊中扮演著重要角色。透過命令提示符,使用者可以輕鬆地獲取到當前電腦上所有網路適配器的MAC位址信息,這對於網路故障排查、配置網路設定等任務非常有幫助。方法一:使用「命令提示字元」1、按【Win+X】組合鍵,或【右鍵】點選工作列上的【Windows標誌】,在開啟的選單項目中,選擇【執行】;2、執行窗口,輸入【cmd】指令,然

一、概述sar命令透過從系統活動中收集的資料來展示系統的使用報告。這些報告由不同部分組成,每個部分都包含資料類型和收集資料的時間。 sar指令的預設模式顯示存取CPU的各種資源(如使用者、系統、I/O調度等)在不同時間增量下的CPU使用率。此外,它還顯示給定時間段內空閒CPU的百分比。報告底部列出了每個數據點的平均值。 sar預設每10分鐘報告一次收集的數據,但您可以使用各種選項來篩選和調整這些報告。與uptime指令類似,sar指令也可協助您監控CPU的負載狀況。透過sar,您可以了解過度負載發

Win11系統中,可以透過指令來啟用或停用Hyper-V增強會話模式。本文將介紹如何使用指令來進行操作,幫助使用者更好地管理和控制系統中的Hyper-V功能。 Hyper-V是Microsoft提供的一種虛擬化技術,它內建在WindowsServer和Windows10、11(家用版除外)中,允許使用者在Windows系統中執行虛擬作業系統。雖然虛擬機器與宿主機作業系統隔離,但透過設置,它們仍然能夠使用宿主機的資源,如音效卡和儲存設備等。其中一個關鍵設定就是啟用「增強會話模式」。增強會話模式是Hyper

程式語言PHP是一種用於Web開發的強大工具,能夠支援多種不同的程式設計邏輯和演算法。其中,實作斐波那契數列是一個常見且經典的程式設計問題。在這篇文章中,將介紹如何使用PHP程式語言來實作斐波那契數列的方法,並附上具體的程式碼範例。斐波那契數列是一個數學上的序列,其定義如下:數列的第一個和第二個元素為1,從第三個元素開始,每個元素的值等於前兩個元素的和。數列的前幾元

小組件是Win11系統的新增功能,預設是開啟狀態,但是難免會出現有部分用戶不太使用到小組件,看著佔位置,因此想要禁用小組件的情況,那麼應該如何操作呢?下面小編就教大家操作方法,大家可以去試試看。什麼是小組件?小元件是小卡片,用於在Windows桌面上顯示你最喜愛的應用程式和服務中的動態內容。它們顯示在小組件板上,你可以在其中發現、固定、取消固定、排列、調整大小和自訂小組件以反映你的興趣。小組件板經過最佳化,可根據使用情況顯示相關小組件和個人化內容。從工作列的左角開啟小組件板,可在其中看到即時天氣

LSOF(ListOpenFiles)是一個命令列工具,主要用於監控類似Linux/Unix作業系統的系統資源。透過LSOF命令,使用者可以獲得有關係統中活動檔案以及正在存取這些檔案的進程的詳細資訊。 LSOF能夠幫助使用者識別目前佔用檔案資源的進程,從而更好地管理系統資源和排除可能的問題。 LSOF的功能強大且靈活,可以幫助系統管理員快速定位檔案相關的問題,例如檔案洩漏、未關閉的檔案描述符等。透過LSOF命令LSOF命令列工具允許系統管理員和開發人員:確定目前正在使用特定檔案或連接埠的進程,在連接埠衝突的情
