Linux自動(dòng)化交互腳本expect從安裝到開(kāi)發(fā)詳解
在日常開(kāi)發(fā)任務(wù)中,運(yùn)行shell腳本有時(shí)候會(huì)提示輸入密碼的操作,如何讓腳本自動(dòng)輸入密碼呢?這時(shí)使用expect幫我們輸入,Expect是基于Tcl發(fā)展而來(lái)的,它不僅可以進(jìn)行交互,還可以根據(jù)程序的提示模擬標(biāo)準(zhǔn)輸入,實(shí)現(xiàn)自動(dòng)化交互執(zhí)行的功能。
expect使用場(chǎng)景
文件傳輸
- 在
FTP/SFTP/SCP文件傳輸過(guò)程中,如果服務(wù)要求輸入用戶(hù)名、密碼或接受安全警告等交互操作,expect可以幫助自動(dòng)完成這些步驟。
SSH登錄自動(dòng)化
- 當(dāng)需要自動(dòng)登錄遠(yuǎn)程服務(wù)器并執(zhí)行一系列命令時(shí),expect可以模擬用戶(hù)輸入密碼或通過(guò)密鑰認(rèn)證,并根據(jù)交互式提示繼續(xù)執(zhí)行。
sudo權(quán)限提升
- 當(dāng)需要以root或其他用戶(hù)權(quán)限運(yùn)行命令,而系統(tǒng)配置為每次使用
sudo都需要輸入密碼時(shí),可以通過(guò)expect預(yù)先輸入密碼并執(zhí)行后續(xù)命令。
數(shù)據(jù)庫(kù)操作
- 在使用數(shù)據(jù)庫(kù)管理系統(tǒng)(如
MySQL, PostgreSQL等)的命令行客戶(hù)端,在連接或執(zhí)行敏感操作時(shí)需要輸入密碼驗(yàn)證,expect腳本能實(shí)現(xiàn)這一過(guò)程的自動(dòng)化。
自動(dòng)安裝程序
- 在安裝軟件包或運(yùn)行配置腳本的過(guò)程中,有些可能包含有交互式的問(wèn)答環(huán)節(jié),expect可用來(lái)自動(dòng)回答這些問(wèn)題,使得安裝或配置過(guò)程完全自動(dòng)化。
系統(tǒng)監(jiān)控任務(wù)
- 在執(zhí)行緊急維護(hù)或故障恢復(fù)時(shí),可能涉及一系列復(fù)雜的手動(dòng)交互流程,通過(guò)expect編寫(xiě)自動(dòng)化腳本能夠減少人為干預(yù),提高效率和準(zhǔn)確性。
網(wǎng)絡(luò)設(shè)備管理
- 對(duì)于路由器、交換機(jī)和其他網(wǎng)絡(luò)設(shè)備,很多管理界面都是基于文本協(xié)議(如telnet或SSH),expect可以用于自動(dòng)登錄設(shè)備并執(zhí)行配置更改等任務(wù)。
總之,任何需要在命令行環(huán)境中進(jìn)行人工交互的任務(wù),只要可以預(yù)測(cè)到交互的內(nèi)容,都可以嘗試使用expect來(lái)實(shí)現(xiàn)自動(dòng)化處理。
安裝expect
查看是否安裝了expect
whereis expect
如果出現(xiàn)如下提示,說(shuō)明未安裝
expect:[root@test ~]#
安裝expect
yum install -y expect
安裝成功提示
再次執(zhí)行whereis expect命令,如果出現(xiàn)如下提示,說(shuō)明安裝成功
expect: /usr/bin/expect /usr/share/man/man1/expect.1.gz
編寫(xiě)sudo提權(quán)腳本
以下是一個(gè)基本的expect腳本示例,它會(huì)自動(dòng)為sudo命令提供密碼。
腳本內(nèi)容
#!/usr/bin/expect # 設(shè)置超時(shí)時(shí)間(單位秒) set timeout 10 # 設(shè)置你的密碼變量 set password "your_password_here" # 執(zhí)行sudo命令,并監(jiān)視其輸出 spawn su root # 當(dāng)提示符出現(xiàn)時(shí),發(fā)送密碼 expect "*Password:" send "$password\r" # 交互模式,等待命令執(zhí)行完成 interact
腳本解釋
spawn su root是啟動(dòng)一個(gè)新的進(jìn)程來(lái)運(yùn)行su命令。expect "*Password:"等待包含"Password:"的提示符出現(xiàn)。send "$password\r"發(fā)送密碼變量值,并附帶回車(chē)符以確認(rèn)輸入。interact可以用來(lái)繼續(xù)監(jiān)控和處理命令行中的其他交互。
常用命令說(shuō)明
命令 | 說(shuō)明 |
set timeout n | 設(shè)置expect語(yǔ)句超時(shí)時(shí)間為n秒。-1為永不超時(shí) |
set name value | 設(shè)置變量名為name,其值為value |
set name [lindex $argv 0] | 設(shè)置變量名為name,其值為 傳入 expect腳本的第一個(gè) 參數(shù) 。第一個(gè)參數(shù)的索引值為0,第二個(gè)為1,依次類(lèi)推 |
spawn | 啟動(dòng)新的進(jìn)程,執(zhí)行命令或者指定程序 |
expect | 接收進(jìn)程中返回的信息, 如果匹配成功(有大小寫(xiě)區(qū)分), 就執(zhí)行expect后的動(dòng)作 |
send | 向進(jìn)程發(fā)送字符串 |
send_user | 用來(lái)打印信息,相當(dāng)于shell中的echo |
exp_continue | 執(zhí)行完expect后的動(dòng)作后,使expect不退出,繼續(xù)往下匹配 |
expect eof | 不允許用戶(hù)交互,直接退出(這個(gè)用的會(huì)比interact多) |
interact | 允許用戶(hù)交互 |
常見(jiàn)錯(cuò)誤
spawn: command not found
執(zhí)行編寫(xiě)好的expect腳本時(shí),報(bào)以下錯(cuò)誤信息,提示spawn: command not found,但通過(guò)rpm -qa | grep expect命令查看到expect軟件包的確安裝了,但是為什么仍然提示spawn命令找不到呢?
問(wèn)題排查
重新排查了報(bào)錯(cuò)的腳本,發(fā)現(xiàn)腳本的首行是#!/bin/sh ,把他改成#!/usr/bin/expect就可以了。
錯(cuò)誤的腳本如下:
#!/bin/sh # 設(shè)置超時(shí)時(shí)間(單位秒) set timeout 10 # 設(shè)置你的密碼變量 set password "your_password_here" # 執(zhí)行sudo命令,并監(jiān)視其輸出 spawn su root # 當(dāng)提示符出現(xiàn)時(shí),發(fā)送密碼 expect "*Password:" send "$password\r" # 交互模式,等待命令執(zhí)行完成 interact
問(wèn)題分析
在編寫(xiě)expect腳本時(shí),在文件的首行需要以#!/usr/bin/expect作為shebang(即解釋器指示符),目的是告訴操作系統(tǒng)應(yīng)當(dāng)使用expect解釋器來(lái)執(zhí)行該腳本內(nèi)容。
然而,如果在執(zhí)行該腳本時(shí),誤用了shell(如sh、bash等)命令進(jìn)行解析和執(zhí)行,由于shell并不具備解析和執(zhí)行expect語(yǔ)句的能力,因此會(huì)導(dǎo)致腳本無(wú)法正確運(yùn)行或出現(xiàn)錯(cuò)誤。
所以,在排查expect腳本執(zhí)行問(wèn)題時(shí),若確認(rèn)腳本內(nèi)部邏輯無(wú)誤,但依然無(wú)法正常工作,應(yīng)關(guān)注腳本是如何被調(diào)用和執(zhí)行的。如果發(fā)現(xiàn)腳本是通過(guò)非預(yù)期的方式執(zhí)行,那么這就可能是問(wèn)題的根源所在。
總結(jié)
到此這篇關(guān)于Linux自動(dòng)化交互腳本expect從安裝到開(kāi)發(fā)詳解的文章就介紹到這了,更多相關(guān)Linux自動(dòng)化交互腳本expect內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- linux中expect的介紹與使用示例
- linux自動(dòng)化交互腳本expect詳解
- Linux expect實(shí)現(xiàn)自動(dòng)登錄腳本實(shí)例代碼
- Linux下使用expect命令編寫(xiě)自動(dòng)化交互腳本
- expect實(shí)現(xiàn)批量修改linux密碼腳本分享
- Linux中使用expect腳本實(shí)現(xiàn)遠(yuǎn)程機(jī)器自動(dòng)登錄
- linux expect實(shí)現(xiàn)登陸遠(yuǎn)程主機(jī)并執(zhí)行命令示例代碼
- 詳解Linux使用shell+expect遠(yuǎn)程登錄主機(jī)
相關(guān)文章
在Linux系統(tǒng)上創(chuàng)建軟連接和硬連接的方法
這篇文章主要介紹了在Linux系統(tǒng)上創(chuàng)建軟連接和硬連接的方法,通過(guò)執(zhí)行 man ln 命令,可以看到這是在文件之間建立鏈接,而沒(méi)有提及是軟鏈接或硬鏈接,文中通過(guò)代碼和圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08
Centos Linux7設(shè)置靜態(tài)IP的實(shí)例
這篇文章主要介紹了Centos Linux7設(shè)置靜態(tài)IP的實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05
linux下通過(guò)rsync+inotify 實(shí)現(xiàn)數(shù)據(jù)實(shí)時(shí)備份(遠(yuǎn)程容災(zāi)備份系統(tǒng))
linux下為了數(shù)據(jù)安全或者網(wǎng)站同步鏡像,不得不考慮一些實(shí)時(shí)備份的問(wèn)題,這篇linux下通過(guò)rsync+inotify 實(shí)現(xiàn)數(shù)據(jù)實(shí)時(shí)備份配置過(guò)程記錄下來(lái),防止遺忘2013-09-09
centos8使用Apache httpd2.4.37安裝web服務(wù)器的步驟詳解
這篇文章主要介紹了centos8使用Apache httpd2.4.37安裝web服務(wù)器的步驟詳解,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
Linux文件操作新手指南之關(guān)于install命令的用法
這篇文章主要介紹了Linux文件操作新手指南之關(guān)于install命令的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02

