【拔刀吧少年】之Expect 自动化控制和测试 Here Document 免交互
免交互
- 一、Here Document免交互
- 1.1 概述
- 1.2 語法格式
- 1.3 簡單案例
- 1.4 支持變量替換
- 1.5 多行注釋
- 1.6 完成自動劃分磁盤免交互
- 二、Expect進行免交互
- 2.1 概述
- 2.2 使用Expect實現面交互功能的操作步驟
- 1)指定腳本解釋器
- 2)spawn
- 3)expect
- 4)send
- 5)結束符 expect eof
- 6)set
- 7)exp_continue
- 8)send user
- 9)接收參數
- 三、expect直接執行,需要使用expect 命令去執行腳本
- 四、完成自動劃分磁盤免交互
一、Here Document免交互
1.1 概述
Here Document使用I/O重定向的方式將命令列表提供給交互式程序或命令,比如 ftp、cat 或 read 命令。
是標準輸入的一種替代品可以幫助腳本開發人員不必使用臨時文件來構建輸入信息,而是直接就地生產出一個"文件"并用作"命令"的標準輸入。Here Document 也可 以與非交互式程序和命令一起使用。
1.2 語法格式
命令 <<標記
…
內容 #標記之間是傳入內容
…
標記
注意事項∶
標記可以使用任意合法字符(通常為EOF)
結尾的標記一定要頂格寫,前面不能有任何字符結尾的
標記后面也不能有任何字符(包括空格)
開頭標記前后的空格會被省略掉
擴展:
免交互方式實現對行數的統計,將要統計的內容置于標記"EOF"之間,直接將內容傳給 wc -1 來統計
wc -l <<EOF
>123
> 345
> 567
> EOF
3
1.3 簡單案例
實例1:
通過read命令接受輸入并打印,輸入值是兩個EOF標記之間的部分,作為變量 i 的值。
實例2:
通過 passwd 給用戶設置密碼。
1.4 支持變量替換
實例1:測試EOF中變量被替換為實際值。
實例2:整體賦值給變量,然后通過echo命令將變量值輸出
在上面的例子中使用單引號將開頭的EOF括住 代表關閉變量的替換功能,按照字符原本的樣子輸出,不做任何修改或替換
在開頭的EOF標記前面加 - (橫杠),代表去掉內容每行之前的TAB字符
1.5 多行注釋
Bash 的默認注釋是"#",該注釋方法只支持單行注釋;Here Document 的引入解決了多行注釋的問題。
"∶"代表什么都不做的空命令。 中間標記區域的內容不會被執行, 會被bash 忽略掉,因此可達到批量注釋的效果。
1.6 完成自動劃分磁盤免交互
[root@localhost ~]# fdisk /dev/sdb <<EOF
> n
> p
>
>
>
>
> w
> EOF
二、Expect進行免交互
2.1 概述
建立在tcl語言基礎上的一個工具,常被用于進行自動化控制和測試,解決shell腳本中交互相關的問題。
2.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/expect2 set dev [lindex $argv 0]3 spawn fdisk $dev4 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腳本內容解釋:
執行腳本結果
總結
以上是生活随笔為你收集整理的【拔刀吧少年】之Expect 自动化控制和测试 Here Document 免交互的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【拔刀吧少年】之sort uniq tr
- 下一篇: 【Q】之Linux中的防火墙netfil