最近開發的一個項目但願實現這樣一個功能。將本地項目建立腳手架置於遠程服務器,而用戶須要建立項目時,僅須要在提供的頁面上填入一些項目基礎配置並提交,後臺便會根據選擇自動化建立項目並push上倉庫。
咋看是個很是簡單的需求,咱們僅須要在用戶發起建立請求時在後端調取shell腳本並能夠實現這一系列的操做。
然而目前項目建立腳手架不支持多參數傳遞,只能經過用戶輸入完成各參數傳遞的操做。
因而拋出本文的主角:Expect,以實現一系列的自動化交互動做。html
expect是一個免費的編程工具,用來實現自動的交互式任務,而無需人爲干預。說白了,expect就是一套用來實現自動交互功能的軟件。在實際工做中,咱們運行命令、腳本或程序時,這些命令、腳本或程序都須要從終端輸入某些繼續運行的指令,而這些輸入都須要人爲的手工進行。而利用expect,則能夠根據程序的提示,模擬標準輸入提供給程序,從而實現自動化交互執行。這就是expect!!!shell
使用expect時,首先須要在文件頂部寫入#!/usr/bin/expect
,已告知進程這是一個expect
文件。而在腳本書寫中基本離不開如下這「六」個命令。編程
spawn
啓動新的進程expect
用來等待一個進程的反饋,咱們根據進程的反饋,再發送對應的交互命send
發送須要交互的值,替代了用戶手動輸入內容set
設置變量值expect eof
自動化結束interact
退出自動化,進入人工交互expect使用的是tcl語法,詳細教程可查閱TCL基本語法 - Tcl教程
這裏提供幾個簡單的流程控制,通常來講已經夠用了。後端
expect參數值存放在$argv
中,好比取第一個參數就是[lindex $argv 0]
,以此類推。服務器
// 執行命令 xxx.sh mike 22 engineer #!/usr/bin/expect set name = [lindex $argv 0] set age = [lindex $argv 1] set job = [lindex $argv 2]
if {$a == 'a'} { set flag = 0 } else { set flag = 1 } expect '*請輸入xxx的值*' send $flag
通常來講expect匹配成功會會退出語句,而exp_continue
表示循環匹配。匹配到改關鍵字後繼續從頭開始匹配。例如安裝軟件時須要輸入多個 yes。yii
expect { "*yes/no*" { send "yes" exp_continue } eof { send "eof" } }
未完待續 工具