shell中的交互模式:expect
阿新 • • 發佈:2018-05-31
TE 結束 IV PE 安裝 AS 郵件 dex for
解壓: 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是如何實現的。
在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.gz1 #!/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