二 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替換成其他東西,意思是把內容當作標準輸入傳給程式。回顧一下 的用法。當...