1. 程式人生 > 其它 >Expect 自動化控制和測試Here Document免互動

Expect 自動化控制和測試Here Document免互動

目錄

一、Here Document免互動

二、Expect進行免互動

三、expect直接執行,需要使用expect 命令去執行指令碼

四、完成自動劃分磁碟免互動

一、Here Document免互動

1、概述   Here Document使用I/O重定向的方式將命令列表提供給互動式程式或命令,比如 ftp、cat 或 read 命令。   是標準輸入的一種替代品可以幫助指令碼開發人員不必使用臨時檔案來構建輸入資訊,而是直接就地生產出一個"檔案"並用作"命令"的標準輸入。Here Document 也可 以與非互動式程式和命令一起使用。 2、語法格式
命令 <<標記
.......
內容       
//標記之間是傳入內容 ....... 標記

注意事項∶

  標記可以使用任意合法字元(通常為EOF)   結尾的標記一定要頂格寫,前面不能有任何字元結尾的   標記後面也不能有任何字元(包括空格)   開頭標記前後的空格會被省略掉 擴充套件: 免互動方式實現對行數的統計,將要統計的內容置於標記"EOF"之間,直接將內容傳給 wc -1 來統計
wc -l <<EOF
> 123
> 345
> 567
> EOF

3、案例


整體賦值給變數,然後通過echo命令將變數值輸出 在上面的例子中使用單引號將開頭的EOF括住 代表關閉變數的替換功能,按照字元原本的樣子輸出,不做任何修改或替換 在開頭的EOF標記前面加 - (橫槓),代表去掉內容每行之前的TAB字元 Bash 的預設註釋是"#",該註釋方法只支援單行註釋;Here Document 的引入解決了多行註釋的問題。 "∶"代表什麼都不做的空命令。 中間標記區域的內容不會被執行, 會被bash 忽略掉,因此可達到批量註釋的效果。 完成自動劃分磁碟免互動
[root@localhost ~]# fdisk /dev/sdb <<EOF
> n > p > > > > > w > EOF

二、Expect進行免互動

1、概述 建立在tcl語言基礎上的一個工具,常被用於進行自動化控制和測試,解決shell指令碼中互動相關的問題。 2、使用Expect實現面交互功能的操作步驟 準備工作:
rpm-q expect      //檢視expect程式是否安裝
rpm-q tcl      //檢視tcl程式是否安裝
yum install -y expect     //未安裝的話進行安裝

1)指定指令碼直譯器

expect 指令碼中首先引入檔案,表明使用的是哪一個 shell。 #!/usr/bin/expect 2)spawn spawn 後面通常跟一個Linux執行命令,表示開啟一個會話、啟動程序,並跟蹤後續互動資訊。 例∶ spawn passwd root 3)expect 判斷上次輸出結果中是否包含指定的字串, 如果有則立即返回,否則就等待超時時間後返回; 只能捕捉由spawn啟動的程序的輸出; 用於接收命令執行後的輸出,然後和期望的字串匹配 expect "匹配內容" {send “後續操作”;} 4)send 向程序傳送字串,用於模擬使用者的輸入;該命令不能自動回車換行,一般要加\r(回車)或者\n,用於代表回車鍵 方式一∶
expect "
密碼"{send "123123\r"} //同一行send部分要有{ }

方式二∶

expect"密碼    //換行send部分不需要有{ )
send "abc123\r"

方式三∶

expect支援多個分支
expect     //只要匹配了其中一個情況,執行相應的 send語句後退出該expect語句
{
"密碼1" {send "123123\r"}
"密碼2" {send "abcdef\r"}
"密碼3" {send "abc123\r"}
}

5)結束符

expect eof

表示互動結束,等待執行結束,退回到原使用者,與spawn對應。 上比如切換到root使用者,expect指令碼預設的是等待5s,當執行完命令後,預設停留5s後,白動切回了原使用者 interact 執行完成後保持互動狀態,把控制權交給控制檯, 會停留在目標終端而不會退回到原終端,這個時候就可以手工操作了,interact後的命令不起作用,比如interact後新增exit,並不會退出root使用者。而如果沒有interact則登入完成後會退出,而不是留在遠端終端上。使用interact會保持在終端而不會退回到原終端,比如切換到root使用者,會一直在root使用者狀態下;比如ssh到另一伺服器,會一直在目標伺服器終端,而不會切回的原伺服器。 注意∶ expect eof 與 interact 只能二選一。 6)set expect 預設的超時時間是 10 秒,通過 set 命令可以設定會話超時時間,若不限制超時時間則應設定為-1。 例∶ set timeout 30 7)exp_continue exp_continue 附加於某個 expect 判斷項之後,可以使該項被匹配後,還能繼續匹配該 expect 判斷語句內的其他項。 exp_continue類似於控制語句中的 continue 語句。表示允許 expect 繼續向下執行指令。 例如∶下例將判斷互動輸出中是否存在 yes/no 或 *password。如果匹配 yes/no 則輸出 yes 並再次執行判斷;如果匹配 *password則輸出 abc123 並結束該段 expect 語句。
expect {
" (yes/no) " {send "yes\r"; exp_continue;}
"*password" { set timeout 300; send "abcl23\r";
}

  注意∶ 使用exp_continue時,如果跟蹤像 passwd 這樣的輸入密碼後就結束程序的命令,expect{}外不要再加上expect eof因為spawn程序結束後會預設向expect傳送eof, 會導致後面的 expect eof 執行報錯

8)send user send_user 表示回顯命令,相當於 echo 9)接收引數 expect 指令碼可以接受從bash命令列傳遞的引數,使用【lindex sargv n】獲得。其中n從0開始,分別表示第一個,第二個,第三個…引數。 例∶ set hostname [lindex $argv 0] #相當於 hostname=s§1 set password [lindex Sargv 1] #相當於 password=$2

三、expect直接執行,需要使用expect 命令去執行指令碼

su切換使用者 先賦予最高許可權777,把指令碼移動到opt目錄。 嵌入執行模式,將expect過程融入Shell 當中,方便執行和處理 建立使用者並設定密碼 實現ssh自動登入

四、完成自動劃分磁碟免互動

指令碼內容如下:
 1 #!/usr/bin/expect
 2 set dev [lindex $argv 0]
 3 spawn fdisk $dev
 4  
 5 expect "(輸入m獲取幫助):"
 6 send "n\r"
 7 expect "(設定分割槽):"
 8 send "p\r"
 9 expect "(1-4,預設為1):"
10 send "\r"
11 expect "起始扇區"
12 send "\r"
13 expect "Last 扇區"
14 send "+6G\r"
15 expect "已設定為Linux 型別"
16 send "w\r"
17  
18 expect eof
指令碼內容解釋: 執行指令碼結果