Shell 程式設計之Expect免互動

2021-10-23 19:26:00 字數 2462 閱讀 4018

四、expect 執行方式

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

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

執行安裝命令

yum install -y expect

expect 指令碼中首先引入檔案,表明使用的是哪乙個shell

#!/usr/bin/expect

spawn 後面通常跟乙個命令,表示開啟乙個會話、啟動程序,並跟蹤後續互動資訊。

例:spawn passwd root

判斷上次輸出結果中是否包含指定的字串,如果有則立即返回,否則就等待超時時間後返回;只能捕捉由spawn啟動的程序的輸出;用於接收命令執行後的輸出,然後和期望的字串匹配

send:向程序傳送字串,用於模擬使用者的輸入;該命令不能自動回車換行,一般要加\r(回車)

例:case1=「密碼」

respond=「abcd123」

expect 「$case1」 或者 expect "case1"

send 「katex parse error: can't use function '\r' in math mode at position 10: response1\̲r̲" 或 expect "case2」 "case3」

}(1)expect eof

等待執行結束,退回到原使用者,與spawn對應

expect指令碼預設的是等待10s,當執行完命令後,預設停留10s後,自動切回了原使用者

(2)interact

執行完成後保持互動狀態,把控制權交給控制台,會停留在目標終端而不會退回到原終端,這個時候就可以手工操作了,interact後的命令不起作用,比如interact後新增exit,並不會退出root使用者,而如果沒有interact則登入完成後會退出,而不是留在遠端終端上。

使用interact會保持在終端而不會退回到原終端,比如切換到root使用者,會一直在root使用者狀態下;比如ssh到另一台伺服器,會一直在目標伺服器終端,而不會切回原伺服器。

expect 預設的超時時間是10秒,通過set命令可以設定會話超時時間,若不限制超時時間則應設定為-1。

例:set timeout 30

exp_continue表示允許expect繼續向下執行命令。

例:expect

「bbb」

「ccc」

}send_user表示回顯命令,相當於echo

expect指令碼可以接收從bash命令列傳遞的引數,使用[lindex $ar** n]獲得,其中n從0開始,分別表示第乙個,第二個,第三個…引數。

例:set hostname [lindex $ar** 0]

set passwd [lindex $ar**1]

[root@localhost ~]

# vim de.sh

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

#超時時間

settimeout 60

log_file test.log

log_user 1

#引數傳入

sethostname

[lindex $ar** 0]

setpasswd

[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

12345678910111213141516171819202122

[root@localhost ~]

# vim sa.sh

#!/bin/bash

#位置變數

hostname=

$1password=

$2/usr/bin/expect <<-eof

spawn ssh root@$

expect

"*password"

}expect

"*]#"

send "exit\r"

expect eof

eof[root@localhost ~]

# chmod +x sa.sh

[root@localhost ~]

# ./sa.sh 192.168.217.132 123456

SHell程式設計之Expect免互動

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

七 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 向程序傳送字串...