liunx之expect操作詳解

導航:

一、expect安裝、介紹、使用場景
二、expect使用原理
三、expect使用語法
四、expect使用舉例
五、expect相關錯誤處理

– – – – – – – – – 分割線 – – – – – – – – – –
一、expect安裝介紹
1.expect命令安裝:
安裝語句:yum install expect
2.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使用舉例

 1.expect腳本實現ssh自動登錄遠程伺服器

#!/usr/bin/expect

spawn ssh [email protected]
expect "*password:"
send "test20221007\r"
expect "*#"
interact

expect expect_demo1.sh 執行查看運行結果:

2.expect腳本實現ssh自動登錄遠程伺服器(通用腳本,手動輸入參數

#!/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  執行查看運行結果:

 3.在shell 中嵌套expect

 通過expect嵌套shell使用語句在shell內直接執行,任何這樣可以實現更多的功能

#!/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程式碼,所以執行採用以下兩種方式都可以

./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"