SHell程式設計之Expect免互動

2021-10-01 20:24:31 字數 2383 閱讀 2210

(1)expect是建立在tcl基礎上的乙個工具,expect是用來進行自動化控制和測試的工具。主要解決shell指令碼中不可互動的問題。對於大規模的linux運維很有幫助。

(2)在linux運維和開發中,我們經常需要遠端登入伺服器進行操作,登入的過程是乙個互動到的過程,可能會需要輸入yes/no password等資訊。為了模擬這種輸入,可以使用expect指令碼。

執行安裝命令

yum install expect -y
該命令不能自動回車換行,一般要加\r(回車)

(1)expect的乙個內部命令,判斷上次輸出結果裡是否包含指定的字串,如果有則立即返回,否則就等待超時間後返回。

(2)只能捕捉由spawn啟動的程序的輸出

常用的格式:

spawn   命令

spawn passwd zhangsan

expect 「提示資訊」

expect 「輸入密碼」

send 代人工輸入的字串 \r(回車)

send 「abc123\r」

timeout:指定超時時間,過期則繼續執行後續指令

單位是:秒

timeout-1 為永不超時

預設情況下,timeout是10秒

exp_coutinue

允許expect繼續向下執行指令

send_user

回顯命令,相當於echo

$ar**引數陣列

expect指令碼可以接受從bash'傳遞的引數,可以使用[lindex $ar** n]獲得,n從0開始,分別表示第乙個、第二個、第三個......引數

expect指令碼必須以interact或expect eof結束,執行自動化任務通常expect eof就夠了

expect eof是在等待結束標誌。由spawn啟動的命令在結束時會產生乙個eof標記,expect eof即在等待這個標記。

單一分支語法

expect "password:"
多分支模式語法

send命令不具備回車換行功能,一般要加\r或\n

expect "aaa" 

expect "aaa"

expect "aaa"

只要匹配了aaa或bbb或ccc中的任意乙個,執行相應的send語句後退出該expect語句

expect 

"bbb"

"ccc"

}

exp_continue 表示繼續後邊的匹配,如果匹配了aaa,執行完send語句後還要繼續向下匹配bbb

expect 

"bbb"

"ccc"

}

(1)直接執行
[root@localhost ~]# vim de.sh

#!/usr/bin/expect //expect開始標誌

#超時時間

set timeout 60

log_file test.log

log_user 1

#引數傳入

set hostname [lindex $ar** 0]

set passwd [lindex $ar** 1]

#追蹤命令

spawn ssh root@$hostname

#捕捉資訊並且匹配,免互動執行

expect

"*password"

} #控制權交給控制台執行

interact

[root@localhost ~]# chmod +x de.sh

[root@localhost ~]# ./de.sh 192.168.217.132 123456

嵌入執行

Shell 程式設計之Expect免互動

四 expect 執行方式 1 expect是建立在tcl基礎上的乙個工具,expect是用來進行自動化控制和測試的工具。主要解決shell指令碼中不可互動的問題。對於大規模的linux運維很有幫助。2 在linux運維和開發中,我們經常需要遠端登入伺服器進行操作,登入的過程是乙個互動到的過程,可能...

七 shell程式設計 expect

1.expect 前言觀察ssh登入的互動現象,有些程式難以避免的需要互動。如何解決指令碼與程式的互動問題。expert就是專門解決指令碼和程式之間的互動問題 語法 spawn expect的內部命令,啟動乙個shell程式 expect 期望哪些內容 yes no 就send傳送yes。r表示回車...

Shell指令碼免密登陸 Expect

1 建立在tcl上的乙個工具 2 用於進行自動化控制和測試 3 解決shell指令碼中互動相關的問題。1 判斷上次輸出結果中是否包含指定的字串,如果有則立即返回,否則就等待超時時間後返回 2 只能捕捉由spawn啟動的程序的輸出 3 用於接收命令執行後的輸出,然後和期望的字串匹配。1 向程序傳送字串...