1. 程式人生 > >shell中的交互模式:expect

shell中的交互模式:expect

TE 結束 IV PE 安裝 AS 郵件 dex for

  在shell開發中,我們連接FTP或者passwd或sudo等操作時,需要手動輸入密碼。對於自動化而言,這顯然是不合適的。而expect的強交互模式解決了這個問題。工作中偶有涉及到這個,個人也是簡單的了解,解決實際問題,作學習記錄。

一:安裝【參考地址:https://www.cnblogs.com/lixigang/articles/4849527.html】

  expect需要Tcl編程語言的支持,所以expect需要安裝兩個東西。一個tcl,一個expect;[安裝前,可通過 "which/whereis expect"判斷服務器是否已安裝]

  1、tcl下載與安裝

    下載: wget http://nchc.dl.sourceforge.net/sourceforge/tcl/tcl8.4.11-src.tar.gz
    解壓: tar -xzvf tcl8.4.11-src.tar.gz 【-C 目標地址]     配置:cd tcl8.4.11/unix && ./configure --prefix=/usr/tcl --enable-shared && make &&make install     拷貝:安裝完畢以後,將目錄unix下面的tclUnixPort.h copy到tcl8.4.11 目錄下的generic目錄中   2、expect下載與安裝     下載:wget http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz
    解壓:tar -xzvf expect5.45.tar.gz     配置:cd expect5.45 [切換到解壓路徑下]     安裝: ./configure --prefix=/usr/expect --with-tcl=/usr/tcl/lib --with-tclinclude=../tcl8.4.11/generic && make && make install   3、創建軟鏈     ln -s /usr/expect/bin/expect /usr/bin/expect [指向引用,這時可以檢查一下自己的Linux是否已安裝expect。有的話就安裝正確了。]
二:命令介紹   我們通過對一個簡單腳本的分析,來看看expect是如何實現的。
 1 #!/usr/bin/expect
 2 set timeout 5
 3 set passwd {9m[S)UWe4r}
 4 spawn su root
 5 expect {
 6   "password" { send "$passwd\r";exp_continue }
 7   "Password" { send "$passwd\r";exp_continue }
 8   eof {;}
 9 }
10 exec sleep 5
11 expect {
12     "#" send{"touch tt\r"}
13     eof {;}
14 }
15 expect eof

1、#!/usr/bin/expect

如果通過sh命令方式調用,則忽略該語句,實際腳本仍以bash腳本語言來執行,應用expect命令調用該文件;如將expect文件賦予可執行權限,輸入對應路徑加文件名(或./文件名),即可實現expect腳本語言方式處理【如果處理過程中,還希望用到bash,可通過在bash腳本中添加/bin/bash方式,調用bash shell。】 2、set timeout 10 設置超時時間,單位:秒 3、設置變量passwd 通過set方式,不需要添加“=”,也可以通過$args傳遞參數,使用[lindex $args n]調用參數,其中n從0開始, 分別表示第一個,第二個,第三個....參數。如我們將傳遞的第一個參數賦值給腳本內部變量:set my_var "[lindex $args 0]" 4、spawn su root 啟動一個進程,並給這個進程加上一個外殼,可用來傳遞交互信息。 5、expect ... 是expect的一個內部命令,等待進程發送的某些字符串(如"password");類型於switch/case,能同時等待多個字符串,並對每一個字符串執行不同的操作。本例中使用了大括號(必須兩個),也可以直接後接字符串如:expect “Password” ;send "$passwd\r" 使用exp_continue後,會重新從當前expect塊的開始重新執行,可以簡單理解問while循環的continue 6、sleep 由於自動執行受限於系統響應時間和send內指令的執行時間,設置sleep時間,單位:秒 7、eof 進程的結束在expect的最後有兩種選擇。一個是用eof匹配,在spawn進程結束後會向expect發送eof,結束進程。也可以使用interact,在執行完成後保持交互狀態將控制權交給控制臺; 謝謝! 原創博客,轉載請註明出處!歡迎郵件溝通:[email protected]

shell中的交互模式:expect