Linux學習之expect操作詳解
一、expect安裝介紹
1.expect命令安裝
安裝語句:yum install expect
2.expect命令含義
expect是一種腳本語言,它能夠代替人工實現(xiàn)與終端的交互,主要應用于執(zhí)行命令和程序時,系統(tǒng)以交互形式要求輸入指定字符串,實現(xiàn)交互通信。
3.expect使用場景
(1)并根據(jù)預定標準回答其問題,回答“是”、“否”或將控制權交還給您
(2)遠程連接設備并執(zhí)行自動化操作
(3)主要是一些需要人機交互的地方,如果提前知道應該輸入什么指令都可以使用expect 工具
二、expect使用原理
1.原理介紹:
spawn啟動指定進程—expect獲取指定關鍵字—send向指定程序發(fā)送指定字符—執(zhí)行完成退出
2、spawn命令介紹:
spawm命令就是用來啟動新的進程的。spawn后的send和expect命令都是和spawn打開的進程進行交互的、
3、send命令介紹:
send命令接收一個字符串參數(shù),并將該參數(shù)發(fā)送到進程,這個過程類似模擬人類輸入密碼
4、interact命令介紹:
結合spawn、expect、send自動化的完成很多任務,interact命令可以在適當?shù)臅r候進行任務的干預,比如下載完ftp文件時,仍然可以停留在ftp命令行狀態(tài),以便手動的執(zhí)行后續(xù)命令
三、expect使用語法
1. expect 啟用選項:
- -c 執(zhí)行腳本前先執(zhí)行的命令,可多次使用
- -d debug模式,可以在運行時輸出一些診斷信息,與在腳本開始處使用exp_internal 1相似。
- -D 啟用交換調式器,可設一整數(shù)參數(shù)。
- -f 從文件讀取命令,僅用于使用#!時。如果文件名為"-",則從stdin讀取(使用"./-"從文件名為-的文件讀取)。
- -i 交互式輸入命令,使用"exit"或"EOF"退出輸入狀態(tài)
- -- 標示選項結束(如果你需要傳遞與expect選項相似的參數(shù)給腳本時),可放到#!行:#!/usr/bin/expect --
- -v 顯示expect版本信息
2.expect命令參數(shù):
- spawn 交互程序開始,執(zhí)行后面的命令或程序。需要進入到expect環(huán)境才可以執(zhí)行,不能直接在shell環(huán)境下直接執(zhí)行
- set timeout n 設置超時時間,表示該腳本代碼需在n秒鐘內完成,如果超過,則退出。用來防止ssh遠程主機網(wǎng)絡不可達時卡住及在遠程主機執(zhí)行命令宕住。如果設置為-1表示不會超時
- set 定義變量
- $argv expect腳本可以接受bash的外部傳參,可以使用[ lindex $argv n ]n為0表示第一個傳參,為1表示第二個傳參,以此類推
- expect 從交互程序進程中指定接收信息, 如果匹配成功, 就執(zhí)行send的指令交互;否則等待timeout秒后自動退出expect語句
- send 如果匹配到expect接受到的信息,就將send中的指令交互傳遞,執(zhí)行交互動作。結尾處加上\r表示如果出現(xiàn)異常等待的狀態(tài)可以進行核查
- exp_continue 表示循環(huán)式匹配,通常匹配之后都會退出語句,但如果有exp_continue則可以不斷循環(huán)匹配,輸入多條命令,簡化寫法。
- exit 退出expect腳本
- expect eof spawn進程結束后會向expect發(fā)送eof,接收到eof代表該進程結束
- interact 執(zhí)行完代碼后保持交互狀態(tài),將控制權交給用戶。沒有該命令執(zhí)行完后自動退出而不是留在遠程終端上
- puts 輸出變量
四、expect使用舉例
1.expect腳本實現(xiàn)ssh自動登錄遠程服務器
#!/usr/bin/expect spawn ssh mrswhite@192.168.37.9 expect "*password:" send "test20221007\r" expect "*#" interact
expect expect_demo1.sh 執(zhí)行查看運行結果:

2.expect腳本實現(xiàn)ssh自動登錄遠程服務器(通用腳本,手動輸入?yún)?shù))
#!/usr/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_demo2.sh 192.168.37.9 mrswhite test20221007 執(zhí)行查看運行結果:

3.在shell 中嵌套expect
通過expect嵌套shell使用語句在shell內直接執(zhí)行,任何這樣可以實現(xiàn)更多的功能
#!/bin/bash
user="mrswhite"
host="192.168.37.9"
password="test20221007"
/usr/bin/expect << EOF
set time 20
spawn ssh $user@$host
expect {
"*yes/no" { send "yes\r"; exp_continue }
"*password:" { send "$password\r" }
}
expect "*#"
send "pwd\r"
expect "*#"
send "df -h\r"
expect "*#"
send "exit\r"
interact
expect eof
EOF
五、expect相關錯誤處理
1.invalid command name "/usr/bin/expect"

解決方案:此時是使用bash腳本嵌套了expect代碼,所以執(zhí)行采用以下兩種方式都可以
./expect_demo3.sh sh expect_demo3.sh

2.invalid command name ":" 轉義問題

解決方案:send里面的內容中的括號[]有問題,不能使用[],將其去除或者添加轉義字符
send "cat 20221007.txt | awk -F : '{print $2}'"
send "cat 20221007.txt | awk -F \[:\] '{print $2}'\r"
以上就是Linux學習之expect操作詳解的詳細內容,更多關于Linux expect的資料請關注腳本之家其它相關文章!
相關文章
Shell腳本中判斷輸入?yún)?shù)個數(shù)的方法
這篇文章主要介紹了Shell腳本中判斷輸入?yún)?shù)個數(shù)的方法,使用內置變量$#即可實現(xiàn)判斷輸入了多少個參數(shù),需要的朋友可以參考下2014-10-10

