shell expect的簡單實用

2021-08-17 17:27:51 字數 1875 閱讀 8862

一.在shell指令碼中嵌入expect來實現密碼輸入

expect是乙個自動互動功能的工具。expect是開了乙個子程序,通過spawn來執行shell指令碼,監測到指令碼的返回結果,通過expect判斷要進行的互動輸入內容(send)

1.安裝expect

需要先安裝tcl:apt-get install tcl

apt-get install expect

2.expect使用

2.1乙個簡單的輸入密碼操作

#!/usr/bin/expect

set timeout 100

set password "123456"

spawn sudo rm -rf zzlogic

expect "root123456"

send "$password\n"

interact

說明:第一行#!/usr/bin/expect表示使用expect的shell互動模式

set是對變數password賦值

set timeout 100:設定超時時間為100秒,如果要執行的shell命令很長可以設定超時時間長一些。expect超過超時時間沒有監測到要找的字串,則不執行,預設timeout為10秒

spawn在expect下執行shell指令碼

expect對通過spawn執行的shell指令碼的返回進行判斷,是否包含「」中的字段

send:如果expect監測到了包含的字串,將輸入send中的內容,\n相當於回車

interact:退出expect返回終端,可以繼續輸入,否則將一直在expect不能退出到終端

2.2expect的命令列引數

[lindex $argv n]獲得index為n的引數(index從0開始計算)

$argc為命令列引數的個數

[lrange $argv 0 0]表示第乙個引數

[lrange $argv 0 3]表示第1到第3個引數

例如scp_service.sh檔案,可以./scp_service.sh -rm來執行,這時是賦值了乙個引數

set option  [lindex $argv 0](獲得第乙個引數存到變數option中,引數是的index是從0開始計算的)

2.3if...elif...else...

expect支援if語句,

if elif else

說明:1.if的條件用{}來包含條件

2.if和後面的{}必須有空格隔開

3.兩個花括號之間必須有空格隔開,比如if {} {},否則會報錯 expect:extra characters after close-brace

3.使用後面

2.4 expect {},多行期望,匹配到哪條執行哪條

背景:有時執行shell後預期結果是不固定的,有可能是詢問是yes/no,有可能是去輸入密碼,所以可以用expect{}

花括號內放多行語句,從上至下匹配,匹配到哪個expect執行哪句。

3.shell中呼叫expect來實現登入

我是通過在shell指令碼中執行expect指令碼的方式來實現的。當然可以將shell中定義的一些變數傳遞給expect指令碼作為引數輸入。可以見我下圖呼叫的乙個例子

說明:經過這次嘗試些expect,給我的感覺是expect對格式的要求比較高,比如花括號之間必須有空格啊之類的,所以如果有報錯,大家可以仔細觀察一下是不是語法格式錯誤了。

簡單的Apache URL Rewrite例項

下面開始講如何設定url rewrite.apache 伺服器 比如我們有新聞頁 news readmore.php?id 4875 我們要做成靜態頁 news top2007,4875.html 首先進入apache的目錄找到名為httpd.conf的檔案。本站為 apache2.2 conf h...

閉鎖CountDownLatch的簡單實現

public class testcountdownlatch catch exception e finally t.start system.out.println c start.countdown 到達此處時,由於finally中已經呼叫了三次countdown 方法,計數已經是0了 所以此...

leveldb之SkipList的簡單實現

skiplist是鍊錶的變形,它在鍊錶的基礎上給每個元素增加了乙個高度,且每個元素的高度是乙個隨機值,因此skiplist是一種隨機化的資料結構。skiplist增 刪查 改的效率都非常高,是一種典型的以空間換時間的儲存方式。常規的鍊錶如下 而相同元素對應的skiplist結構如下 由上可知,當要在...