Linux自動化交互腳本expect從安裝到開發(fā)詳解
在日常開發(fā)任務(wù)中,運行shell腳本有時候會提示輸入密碼的操作,如何讓腳本自動輸入密碼呢?這時使用expect幫我們輸入,Expect是基于Tcl發(fā)展而來的,它不僅可以進行交互,還可以根據(jù)程序的提示模擬標(biāo)準(zhǔn)輸入,實現(xiàn)自動化交互執(zhí)行的功能。
expect使用場景
文件傳輸
- 在
FTP/SFTP/SCP
文件傳輸過程中,如果服務(wù)要求輸入用戶名、密碼或接受安全警告等交互操作,expect可以幫助自動完成這些步驟。
SSH登錄自動化
- 當(dāng)需要自動登錄遠程服務(wù)器并執(zhí)行一系列命令時,expect可以模擬用戶輸入密碼或通過密鑰認(rèn)證,并根據(jù)交互式提示繼續(xù)執(zhí)行。
sudo權(quán)限提升
- 當(dāng)需要以root或其他用戶權(quán)限運行命令,而系統(tǒng)配置為每次使用
sudo
都需要輸入密碼時,可以通過expect預(yù)先輸入密碼并執(zhí)行后續(xù)命令。
數(shù)據(jù)庫操作
- 在使用數(shù)據(jù)庫管理系統(tǒng)(如
MySQL, PostgreSQL
等)的命令行客戶端,在連接或執(zhí)行敏感操作時需要輸入密碼驗證,expect腳本能實現(xiàn)這一過程的自動化。
自動安裝程序
- 在安裝軟件包或運行配置腳本的過程中,有些可能包含有交互式的問答環(huán)節(jié),expect可用來自動回答這些問題,使得安裝或配置過程完全自動化。
系統(tǒng)監(jiān)控任務(wù)
- 在執(zhí)行緊急維護或故障恢復(fù)時,可能涉及一系列復(fù)雜的手動交互流程,通過expect編寫自動化腳本能夠減少人為干預(yù),提高效率和準(zhǔn)確性。
網(wǎng)絡(luò)設(shè)備管理
- 對于路由器、交換機和其他網(wǎng)絡(luò)設(shè)備,很多管理界面都是基于文本協(xié)議(如telnet或SSH),expect可以用于自動登錄設(shè)備并執(zhí)行配置更改等任務(wù)。
總之,任何需要在命令行環(huán)境中進行人工交互的任務(wù),只要可以預(yù)測到交互的內(nèi)容,都可以嘗試使用expect來實現(xiàn)自動化處理。
安裝expect
查看是否安裝了expect
whereis expect
如果出現(xiàn)如下提示,說明未安裝
expect:[root@test ~]#
安裝expect
yum install -y expect
安裝成功提示
再次執(zhí)行whereis expect
命令,如果出現(xiàn)如下提示,說明安裝成功
expect: /usr/bin/expect /usr/share/man/man1/expect.1.gz
編寫sudo提權(quán)腳本
以下是一個基本的expect
腳本示例,它會自動為sudo
命令提供密碼。
腳本內(nèi)容
#!/usr/bin/expect # 設(shè)置超時時間(單位秒) set timeout 10 # 設(shè)置你的密碼變量 set password "your_password_here" # 執(zhí)行sudo命令,并監(jiān)視其輸出 spawn su root # 當(dāng)提示符出現(xiàn)時,發(fā)送密碼 expect "*Password:" send "$password\r" # 交互模式,等待命令執(zhí)行完成 interact
腳本解釋
spawn su root
是啟動一個新的進程來運行su命令。expect "*Password:"
等待包含"Password:"的提示符出現(xiàn)。send "$password\r"
發(fā)送密碼變量值,并附帶回車符以確認(rèn)輸入。interact
可以用來繼續(xù)監(jiān)控和處理命令行中的其他交互。
常用命令說明
命令 | 說明 |
set timeout n | 設(shè)置expect語句超時時間為n秒。-1為永不超時 |
set name value | 設(shè)置變量名為name,其值為value |
set name [lindex $argv 0] | 設(shè)置變量名為name,其值為 傳入 expect腳本的第一個 參數(shù) 。第一個參數(shù)的索引值為0,第二個為1,依次類推 |
spawn | 啟動新的進程,執(zhí)行命令或者指定程序 |
expect | 接收進程中返回的信息, 如果匹配成功(有大小寫區(qū)分), 就執(zhí)行expect后的動作 |
send | 向進程發(fā)送字符串 |
send_user | 用來打印信息,相當(dāng)于shell中的echo |
exp_continue | 執(zhí)行完expect后的動作后,使expect不退出,繼續(xù)往下匹配 |
expect eof | 不允許用戶交互,直接退出(這個用的會比interact多) |
interact | 允許用戶交互 |
常見錯誤
spawn: command not found
執(zhí)行編寫好的expect腳本時,報以下錯誤信息,提示spawn: command not found
,但通過rpm -qa | grep expect
命令查看到expect軟件包的確安裝了,但是為什么仍然提示spawn命令找不到呢?
問題排查
重新排查了報錯的腳本,發(fā)現(xiàn)腳本的首行是#!/bin/sh
,把他改成#!/usr/bin/expect
就可以了。
錯誤的腳本如下:
#!/bin/sh # 設(shè)置超時時間(單位秒) set timeout 10 # 設(shè)置你的密碼變量 set password "your_password_here" # 執(zhí)行sudo命令,并監(jiān)視其輸出 spawn su root # 當(dāng)提示符出現(xiàn)時,發(fā)送密碼 expect "*Password:" send "$password\r" # 交互模式,等待命令執(zhí)行完成 interact
問題分析
在編寫expect腳本時,在文件的首行需要以#!/usr/bin/expect
作為shebang(即解釋器指示符),目的是告訴操作系統(tǒng)應(yīng)當(dāng)使用expect解釋器來執(zhí)行該腳本內(nèi)容。
然而,如果在執(zhí)行該腳本時,誤用了shell(如sh、bash等)命令進行解析和執(zhí)行,由于shell并不具備解析和執(zhí)行expect語句的能力,因此會導(dǎo)致腳本無法正確運行或出現(xiàn)錯誤。
所以,在排查expect腳本執(zhí)行問題時,若確認(rèn)腳本內(nèi)部邏輯無誤,但依然無法正常工作,應(yīng)關(guān)注腳本是如何被調(diào)用和執(zhí)行的。如果發(fā)現(xiàn)腳本是通過非預(yù)期的方式執(zhí)行,那么這就可能是問題的根源所在。
總結(jié)
到此這篇關(guān)于Linux自動化交互腳本expect從安裝到開發(fā)詳解的文章就介紹到這了,更多相關(guān)Linux自動化交互腳本expect內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ubuntu+php環(huán)境下的Memcached 安裝方法
Memcached是一套分散式的高速緩存系統(tǒng),當(dāng)初是Danga Interactive為了LiveJournal所發(fā)展2011-11-11Linux命令中Ctrl+z、Ctrl+c和Ctrl+d的區(qū)別和使用詳解
這篇文章主要介紹了Linux命令中Ctrl+z、Ctrl+c和Ctrl+d的區(qū)別和使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Linux內(nèi)核設(shè)備驅(qū)動之內(nèi)核中鏈表的使用筆記整理
今天小編就為大家分享一篇關(guān)于Linux內(nèi)核設(shè)備驅(qū)動之內(nèi)核中鏈表的使用筆記整理,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12使用Putty遠程(SSH)管理Linux VPS的圖文教程
Putty是一個免費的、Windows 32平臺下的telnet、rlogin和ssh客戶端,但是功能絲毫不遜色于商業(yè)的telnet類工具。2010-12-12CentOS安裝jdk的幾種方法及配置環(huán)境變量方式
這篇文章主要介紹了CentOS安裝jdk的幾種方法及配置環(huán)境變量方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12