使用Expect實現自動化交互

*寫在前面

最近開發的一個項目但願實現這樣一個功能。將本地項目建立腳手架置於遠程服務器,而用戶須要建立項目時,僅須要在提供的頁面上填入一些項目基礎配置並提交,後臺便會根據選擇自動化建立項目並push上倉庫。
咋看是個很是簡單的需求,咱們僅須要在用戶發起建立請求時在後端調取shell腳本並能夠實現這一系列的操做。
然而目前項目建立腳手架不支持多參數傳遞,只能經過用戶輸入完成各參數傳遞的操做。
因而拋出本文的主角:Expect,以實現一系列的自動化交互動做。html

Expect簡介

expect是一個免費的編程工具,用來實現自動的交互式任務,而無需人爲干預。說白了,expect就是一套用來實現自動交互功能的軟件。

在實際工做中,咱們運行命令、腳本或程序時,這些命令、腳本或程序都須要從終端輸入某些繼續運行的指令,而這些輸入都須要人爲的手工進行。而利用expect,則能夠根據程序的提示,模擬標準輸入提供給程序,從而實現自動化交互執行。這就是expect!!!shell

Expect命令

使用expect時,首先須要在文件頂部寫入#!/usr/bin/expect,已告知進程這是一個expect文件。而在腳本書寫中基本離不開如下這「六」個命令。編程

  • spawn 啓動新的進程
  • expect 用來等待一個進程的反饋,咱們根據進程的反饋,再發送對應的交互命
  • send 發送須要交互的值,替代了用戶手動輸入內容
  • set 設置變量值
  • expect eof 自動化結束
  • interact 退出自動化,進入人工交互

Expect語法

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/else

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"
    }
}

栗子

未完待續 工具

相關文章
相關標籤/搜索