linux下使用expect的注意事項

2021-09-26 22:06:59 字數 1999 閱讀 2391

linux下的expect使用坑很多,如果不遇到就不知道還有這麼多要注意的,可能並不全面,但我會逐漸把遇到的每個坑都更新到裡面。

這是我在我的伺服器上測試過的語句,最後得出結論是spawn開啟的新程序,後面的expect和send都是在和這個程序打交道,如果再重新開啟乙個spawn會自動退出上乙個程序,然後重新開啟。比如我在圖中spawn連線了遠端伺服器,執行一些語句,然後再開啟乙個spawn,那麼第二個spawn會在本地執行,因為他們不屬於同乙個程序了。還有一點是,開啟了spawn的程序中,輸入send 傳送互動語句的時候 在後面必須有乙個expect,spawn 命令是出現互動式的前提下的  但是expect 匹配不上的話,那麼它就會按照timeout 的設定進行等待

#!/usr/bin/expect

23 set timeout 30

4 spawn ssh 10.192.224.224

5 expect "password:"

6 send "mypassword\n"

7 expect "*$"

上面這個例子中send "mkdir tmpdir\n" #遠端執行命令用send傳送,不用spawn, expect "*$" #注意這個地方,要與作業系統上環境變數相匹配,尤其是有空格的情況下,一定在expct "*$ "把空格加上,加不上你就完蛋了。我試過。 這個例子實際上是通過ssh 去登入遠端機器,並且在遠端機器上建立乙個目錄, 我們看到在我們輸入密碼後並沒有去expect eof,這是因為ssh 這個spawn 並沒 有結束,而且手動操作時ssh 實際上也不會自己結束除非你exit;所以你只能 expect bash 的提示符,當然也可以是機器名等,這樣才可以在遠端建立乙個目 錄。 注意,請不要用spawn mkdir tmpdir,這樣會使得上乙個spawn 即ssh 結束,那 麼你的tmpdir 將在本機建立。 當然實際情況下可能會要你確認ssh key,可以通過並行的expect 進行處理,不 多贅述。

#!/usr/bin/expect

set timeout 10

set host [lindex $ar** 0]

set username [lindex $ar** 1]

set password [lindex $ar** 2]

set src_file [lindex $ar** 3]

set dest_file [lindex $ar** 4]

spawn scp $src_file $username@$host:$dest_file

expect

}"*assword:"

}expect "100%"

expect eof

截圖如下:

注意**剛開始的第一行,指定了expect的路徑,與shell指令碼相同,這一句指定了程式在執行時到**去尋找相應的啟動程式。**剛開始還設定了timeout的時間為10秒,如果在執行scp任務時遇到了**中沒有指定的異常,則在等待10秒後該指令碼的執行會自動終止。 spawn代表在本地終端執行的語句,在該語句開始執行後,expect開始捕獲終端的輸出資訊,然後做出對應的操作。expect**中的捕獲的(yes/no)內容用於完成第一次訪問目標主機時儲存金鑰的操作。有了這一句,scp的任務減少了中斷的情況。**結尾的expect eof與spawn對應,表示捕獲終端輸出資訊的終止。 有了這段expect的**,還只能完成對單個遠端主機的scp任務。如果需要實現批量scp的任務,則需要再寫乙個shell指令碼來呼叫這個expect指令碼。

注意,如果遠端主機密碼中有「$」、「#」這類特殊字元的話,在編寫列表檔案時就需要在這些特殊字元前加上轉義字元,否則expect在執行時會輸入錯誤的密碼。

linux 下expect的使用

usr bin expect set timeout 60 spawn ssh l guest 210.45.114.190 expect password expect guest node43 send cd sa11011033 r expect guest node43 send touch...

linux下expect的使用

expect 使用 安裝 yum y install expect 1,首行宣告 2,控制台輸出 3,設定日期變數 date 4,設定ip變數 local ip 127.0.0.1 usr bin expect f set date exec date y m d set ip1 123.57.21...

Linux下expect的安裝和使用

要使用expect需要預先安裝tcl這個東西,然後再安裝expect包.我這裡使用的是tcl8.4.11 src.tar.gz和expect 5.43.0.tar.gz的安裝包.安裝tcl和expect tar zxvf tcl8.4.11 src.tar.gz cd tcl8.4.11 unix ...