shell中的交互模式:expect


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

 

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

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

   1、tcl下載與安裝

    解壓: 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,在執行完成后保持交互狀態將控制權交給控制台;
 
謝謝!
 
 
 
 原創博客,轉載請注明出處!歡迎郵件溝通:shj8319@sina.com
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM