liunx之expect操作詳解

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

liunx之expect操作詳解

文章插圖
2.expect腳本實現ssh自動登錄遠程服務器(通用腳本,手動輸入參數)
#!/usr/bin/expectif {$argc < 3} {    puts "Usage:cmd <host> <username> <password>"    exit 1}set timeout -1set host [ lindex $argv 0 ]set username [ lindex $argv 1 ]set password [ lindex $argv 2 ]spawn ssh  $username@$hostexpect "*password*" {send "$password\r"}interact./expect_demo2.sh 192.168.37.9 mrswhite  test20221007  執行查看運行結果:
liunx之expect操作詳解

文章插圖
 3.在shell 中嵌套expect

推薦閱讀