【拔刀吧少年】之Expect 自动化控制和测试 Here Document 免交互
免交互
- 一、Here Document免交互
- 1.1 概述
- 1.2 語法格式
- 1.3 簡單案例
- 1.4 支持變量替換
- 1.5 多行注釋
- 1.6 完成自動劃分磁盤免交互
- 二、Expect進(jìn)行免交互
- 2.1 概述
- 2.2 使用Expect實(shí)現(xiàn)面交互功能的操作步驟
- 1)指定腳本解釋器
- 2)spawn
- 3)expect
- 4)send
- 5)結(jié)束符 expect eof
- 6)set
- 7)exp_continue
- 8)send user
- 9)接收參數(shù)
- 三、expect直接執(zhí)行,需要使用expect 命令去執(zhí)行腳本
- 四、完成自動劃分磁盤免交互
一、Here Document免交互
1.1 概述
Here Document使用I/O重定向的方式將命令列表提供給交互式程序或命令,比如 ftp、cat 或 read 命令。
是標(biāo)準(zhǔn)輸入的一種替代品可以幫助腳本開發(fā)人員不必使用臨時(shí)文件來構(gòu)建輸入信息,而是直接就地生產(chǎn)出一個(gè)"文件"并用作"命令"的標(biāo)準(zhǔn)輸入。Here Document 也可 以與非交互式程序和命令一起使用。
1.2 語法格式
命令 <<標(biāo)記
…
內(nèi)容 #標(biāo)記之間是傳入內(nèi)容
…
標(biāo)記
注意事項(xiàng)∶
標(biāo)記可以使用任意合法字符(通常為EOF)
結(jié)尾的標(biāo)記一定要頂格寫,前面不能有任何字符結(jié)尾的
標(biāo)記后面也不能有任何字符(包括空格)
開頭標(biāo)記前后的空格會被省略掉
擴(kuò)展:
免交互方式實(shí)現(xiàn)對行數(shù)的統(tǒng)計(jì),將要統(tǒng)計(jì)的內(nèi)容置于標(biāo)記"EOF"之間,直接將內(nèi)容傳給 wc -1 來統(tǒng)計(jì)
wc -l <<EOF
>123
> 345
> 567
> EOF
3
1.3 簡單案例
實(shí)例1:
通過read命令接受輸入并打印,輸入值是兩個(gè)EOF標(biāo)記之間的部分,作為變量 i 的值。
實(shí)例2:
通過 passwd 給用戶設(shè)置密碼。
1.4 支持變量替換
實(shí)例1:測試EOF中變量被替換為實(shí)際值。
實(shí)例2:整體賦值給變量,然后通過echo命令將變量值輸出
在上面的例子中使用單引號將開頭的EOF括住 代表關(guān)閉變量的替換功能,按照字符原本的樣子輸出,不做任何修改或替換
在開頭的EOF標(biāo)記前面加 - (橫杠),代表去掉內(nèi)容每行之前的TAB字符
1.5 多行注釋
Bash 的默認(rèn)注釋是"#",該注釋方法只支持單行注釋;Here Document 的引入解決了多行注釋的問題。
"∶"代表什么都不做的空命令。 中間標(biāo)記區(qū)域的內(nèi)容不會被執(zhí)行, 會被bash 忽略掉,因此可達(dá)到批量注釋的效果。
1.6 完成自動劃分磁盤免交互
[root@localhost ~]# fdisk /dev/sdb <<EOF
> n
> p
>
>
>
>
> w
> EOF
二、Expect進(jìn)行免交互
2.1 概述
建立在tcl語言基礎(chǔ)上的一個(gè)工具,常被用于進(jìn)行自動化控制和測試,解決shell腳本中交互相關(guān)的問題。
2.2 使用Expect實(shí)現(xiàn)面交互功能的操作步驟
準(zhǔn)備工作:
rpm-q expect #查看expect程序是否安裝
rpm-q tcl #查看tcl程序是否安裝
yum install_-y expect #未安裝的話進(jìn)行安裝
1)指定腳本解釋器
expect 腳本中首先引入文件,表明使用的是哪一個(gè) shell。
#!/usr/bin/expect
2)spawn
spawn 后面通常跟一個(gè)Linux執(zhí)行命令,表示開啟一個(gè)會話、啟動進(jìn)程,并跟蹤后續(xù)交互信息。
例∶ spawn passwd root
3)expect
判斷上次輸出結(jié)果中是否包含指定的字符串, 如果有則立即返回,否則就等待超時(shí)時(shí)間后返回;
只能捕捉由spawn啟動的進(jìn)程的輸出;
用于接收命令執(zhí)行后的輸出,然后和期望的字符串匹配
expect “匹配內(nèi)容” {send “后續(xù)操作”;}
4)send
向進(jìn)程發(fā)送字符串,用于模擬用戶的輸入;該命令不能自動回車換行,一般要加\r(回車)或者\(yùn)n,用于代表回車鍵
方式一∶
expect “密碼”{send “123123\r”} #同一行send部分要有{ }
方式二∶
expect"密碼 #換行send部分不需要有{ )
send “abc123\r”
方式三∶
expect支持多個(gè)分支
expect #只要匹配了其中一個(gè)情況,執(zhí)行相應(yīng)的 send語句后退出該expect語句
{
“密碼1” {send “123123\r”}
“密碼2” {send “abcdef\r”}
“密碼3” {send “abc123\r”}
}
5)結(jié)束符 expect eof
表示交互結(jié)束,等待執(zhí)行結(jié)束,退回到原用戶,與spawn對應(yīng)。
上比如切換到root用戶,expect腳本默認(rèn)的是等待5s,當(dāng)執(zhí)行完命令后,默認(rèn)停留5s后,白動切回了原用戶
interact
執(zhí)行完成后保持交互狀態(tài),把控制權(quán)交給控制臺, 會停留在目標(biāo)終端而不會退回到原終端,這個(gè)時(shí)候就可以手工操作了,interact后的命令不起作用,比如interact后添加exit,并不會退出root用戶。而如果沒有interact則登錄完成后會退出,而不是留在遠(yuǎn)程終端上。使用interact會保持在終端而不會退回到原終端,比如切換到root用戶,會一直在root用戶狀態(tài)下;比如ssh到另一服務(wù)器,會一直在目標(biāo)服務(wù)器終端,而不會切回的原服務(wù)器。
注意∶ expect eof 與 interact 只能二選一。
6)set
expect 默認(rèn)的超時(shí)時(shí)間是 10 秒,通過 set 命令可以設(shè)置會話超時(shí)時(shí)間,若不限制超時(shí)時(shí)間則應(yīng)設(shè)置為-1。
例∶ set timeout 30
7)exp_continue
exp_continue 附加于某個(gè) expect 判斷項(xiàng)之后,可以使該項(xiàng)被匹配后,還能繼續(xù)匹配該 expect 判斷語句內(nèi)的其他項(xiàng)。
exp_continue類似于控制語句中的 continue 語句。表示允許 expect 繼續(xù)向下執(zhí)行指令。
例如∶下例將判斷交互輸出中是否存在 yes/no 或 *password。如果匹配 yes/no 則輸出 yes 并再次執(zhí)行判斷;如果匹配 *password則輸出 abc123 并結(jié)束該段 expect 語句。
expect {
" (yes/no) " {send “yes\r”; exp_continue;}
“*password” { set timeout 300; send “abcl23\r”;
}
注意∶ 使用exp_continue時(shí),如果跟蹤像 passwd 這樣的輸入密碼后就結(jié)束進(jìn)程的命令,expect{}外不要再加上expect eof因?yàn)閟pawn進(jìn)程結(jié)束后會默認(rèn)向expect發(fā)送eof, 會導(dǎo)致后面的 expect eof 執(zhí)行報(bào)錯(cuò)
8)send user
send_user 表示回顯命令,相當(dāng)于 echo
9)接收參數(shù)
expect 腳本可以接受從bash命令行傳遞的參數(shù),使用【lindex sargv n】獲得。其中n從0開始,分別表示第一個(gè),第二個(gè),第三個(gè)…參數(shù)。
例∶
set hostname [lindex $argv 0] #相當(dāng)于 hostname=s§1
set password [lindex Sargv 1] #相當(dāng)于 password=$2
三、expect直接執(zhí)行,需要使用expect 命令去執(zhí)行腳本
su切換用戶
先賦予最高權(quán)限777,把腳本移動到opt目錄。
嵌入執(zhí)行模式,將expect過程融入Shell 當(dāng)中,方便執(zhí)行和處理
創(chuàng)建用戶并設(shè)置密碼
實(shí)現(xiàn)ssh自動登錄
四、完成自動劃分磁盤免交互
腳本內(nèi)容如下:
1 #!/usr/bin/expect2 set dev [lindex $argv 0]3 spawn fdisk $dev4 5 expect "(輸入m獲取幫助):"6 send "n\r"7 expect "(設(shè)置分區(qū)):"8 send "p\r"9 expect "(1-4,默認(rèn)為1):" 10 send "\r" 11 expect "起始扇區(qū)" 12 send "\r" 13 expect "Last 扇區(qū)" 14 send "+6G\r" 15 expect "已設(shè)置為Linux 類型" 16 send "w\r" 17 18 expect eof腳本內(nèi)容解釋:
執(zhí)行腳本結(jié)果
總結(jié)
以上是生活随笔為你收集整理的【拔刀吧少年】之Expect 自动化控制和测试 Here Document 免交互的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【拔刀吧少年】之sort uniq tr
- 下一篇: 【Q】之防火墙的SNAT DANT原理应