理論 實驗 詳解Expect免互動

2021-10-23 19:38:22 字數 3944 閱讀 4915

二 expect概述

使用i/o重定向的方式將命令列表提供給互動式程式,標準輸入的一種替代品

命令 《標記

… #標記之間是傳入內容…標記

注意事項:

標記可以使用任意合法字元(通常為eof)

結尾的標記一定要頂格寫,前面不能有任何字元

結尾的標記後面也不能有任何字元(包括空格)

開頭標記前後的空格會被省略掉

免互動方式實現對行數的統計,將要統計的內容於標記「eof」之間,直接將內容傳給wc -l 來統計

[root@localhost ~]

# wc -l <> line1

> line2

> eof

2

通過read命令接收輸入並列印,輸入值是兩個eof標記之間的部分,作為變數i的值

[root@localhost ~]

# read i <> hello

> eof

[root@localhost ~]

# echo $i

hello

通過passwd給使用者設定密碼

[root@localhost ~]

# passwd lisi <> abc123 //這兩行是輸入的密碼和確認密碼

> abc123

> eof

[root@localhost ~]

# vim ceshi2.sh

#!/bin/bash

file=

"eof1.txt"

i="school"

cat>

$file

<<

eofi am going to $i

eofcat eof1.txt

[root@localhost ~]

# chmod +x ceshi2.sh

[root@localhost ~]

# ./ceshi2.sh

i am going to school

#!/bin/bash

var=

"great! i am going to school!"

myvar=

$(cat

<<

eofthis is line 1

today is monday

$var

eof)

echo

$myvar

#!/bin/bash

var=

"great! i am going to school!"

myvar=

$(cat

<<

'eof' //對標記加單引號,即可關閉變數替換

this is line 1

today is monday

$var

eof)

echo

$myvar

#!/bin/bash

var=

"great! i am going to school!"

myvar=

$(cat

<<-eof //對標記前加「-」,即可抑制各行首tab或空格

this is line 1

today is monday

$var

eof)

echo

$myvar

#!/bin/bash

var=

"great! i am going to school!"

:<<-eof //多行注釋,「:」開頭的標記內容不會被執行

this is line 1

today is monday

$var

eofecho

"abcd"

expect是建立在tcl語言基礎上的乙個工具,常被用於進行自動化控制和測試,解決shell指令碼中互動相關的問題

[root@localhost ~]

# rpm -q expect //檢視expect相關資訊

expect-5.45-14.el7_1.x86_64

[root@localhost ~]

# rpm -q tcl //檢視tcl相關資訊

tcl-8.5.13-8.el7.x86_64

[root@localhost ~]

# yum -y install expect //如果沒有安裝,則用yum安裝

指令碼注釋器

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

#!/usr/bin/expext

spawn

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

例: spawn passwd root

expect

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

send

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

結束符expect eof

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

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

interact

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

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

注意:expect eof 與 interact 只能二選一。

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

例:set timeout 30

exp_continue

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

例:

expect

"bbb"

"ccc"

}

send_user

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

接收引數

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

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

set password [lindex $ar** 1]

建立使用者並設定密碼

#!/bin/bash

user=

$1passwd=

$2#非互動命令放在expect外面

useradd

$user

#開始免互動執行

expect

<<

eofspawn passwd $user #開啟乙個程序跟蹤passwd命令,expect只能捕捉該程序資訊

expect \r"; exp_continue} #匹配輸出資訊「new password:」;自動輸入密碼

"password:" #匹配輸出資訊「password:」

\r"} #自動輸入密碼

}expect eof #等待結束標記

eof

SHell程式設計之Expect免互動

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

Shell 程式設計之Expect免互動

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

ShellEOF說明,Expect詳解

二 expect概述 三 基本命令 四 expect語法 五 expect執行方式 前言 shell中通常將eof與 結合使用,表示後續的輸入作為子命令或子shell的輸入,直到遇到eof為止,再返回到主調shell。可以把eof替換成其他東西,意思是把內容當作標準輸入傳給程式。回顧一下 的用法。當...