Expect的乙個簡單使用

2022-05-06 12:48:13 字數 1563 閱讀 7436

最近在寫乙個自動部署環境的指令碼.發現shell在遠端scp或ssh時.都需要提示輸入密碼.嘗試建立server端的信任關係發現行不通(可能是基於安全考慮?)

不過,使用了另外一種方法解決了這個問題.它就是」expect」, 我覺得寫有互動的shell還是挺有用的.現學現賣跟大家share一下.

什麼是expect?

在做系統管理時,我們很多時候需要輸入密碼,例如:連線 ssh,連線ftp,

那麼如何能做到不輸入密碼嗎?   我們需要有乙個工具,能代替我們實現與終端的互動

那麼,就是它:expect,管理員的最好的朋友之一

expect是在tcl基礎上建立起來的,它還提供了一些tcl所沒有的命令。spawn命令啟用乙個unix程式來進行互動式的執行。 send命令向程序傳送字串。expect命令等待程序的某些字串。 expect支援正規表示式並能同時等待多個字串,並對每乙個字串執行不同的操作。expect還能理解一些特殊情況,如超時和遇到檔案尾.

expect命令和tcl的case命令的風格很相似。都是用乙個字串去匹配多個字串。(只要有可能,新的命令總是和已有的tcl命令相似,以使得該語言保持工具族的繼承性)。命令格式如下:

expect patlist1 action1 patlist2 action2.....

該命令一直等到當前程序的輸出和以上的某乙個模式相匹配,或者等到時間超過乙個特定的時間長度,或者等到遇到了檔案的結束為止。

每乙個patlist都由乙個模式或者模式的表(lists)組成。如果有乙個模式匹配成功,相應的action就被執行。執行的結果從expect返回.

安裝expect

因為expect是基於tcl的,所以需要系統先安裝tcl.

檢視tcl是否已經安裝 執行:」 whereis tcl」

當前yum上就有個5.42.1版本.

expect.x86_64                            5.42.1-1

沒裝的話裝上就可以了

使用expect

下面用幾個指令碼演示下expect的使用

scp.sh

#!/usr/bin/expect -f

expect -c "

set timeout 1200;

spawn /usr/bin/scp -r $1 $4@$2:$3

expect

\"*password\"

}expect eofi;"

ssh.sh

指令碼中給定乙個超時時間.這個約束使用者必須在多久時間內進行輸入.

呼叫spawn啟動命令的會話,引數使用與shell一致.

決定如何響應.這裡使用了正規表示式.針對不同響應傳送不同的訊息.

比如上面的scp.sh 和ssh.sh.

我們可以在下面的shell中直接呼叫.

sh  scp.sh test_scp001  v039166.sqa.cm4 /home/shichengfeng.tw/ shichengfeng.tw shicf1204

當然,expect還可以解決更多的互動式問題,比如自動telnet,ftp等,並可以支援更多的語法.這裡不再一一羅列.趕興趣的同學可以繼續研究.

expect指令碼安裝和乙個簡單的指令碼

前不久因為進行異地copy資料,就想到了scp,但是這個東西需要手動去輸入密碼,不能放到後台去執行,於是就考慮有沒有辦法讓他自動輸入密碼呢,最終發現了expect這個東西,很強大的東西,所以我就在本地測試了下,最終實現了不用手動輸入密碼也可以進行copy資料,拿來與大家分享.要使用expect需要預...

C ( 的乙個簡單的使用)

knnsearchresultadaptor neighborhood results,size t k,scalart max radius std numeric limits max results results k k count 0 這裡總結一下 的使用 其實冒號後的內容是初始化成員列表...

expect 的小點 expect的使用

expect password send 123456 r 注意 expect 和字串 password 中間有乙個空格,send和字串 123456 r 中間有乙個空格。因為expect和send都是乙個命令,只有加空格才能與引數分開。expect 注意 expect與 之間有乙個空格,因為這樣e...