运用Expect完成自动化交互

*写在前面

近来开辟的一个项目愿望完成如许一个功用。将当地项目建立脚手架置于长途服务器,而用户须要建立项目时,仅须要在供应的页面上填入一些项目基础设置并提交,背景便会依据挑选自动化建立项目并push上堆栈。
咋看是个异常简朴的需求,我们仅须要在用户提议建立要求时在后端调取shell剧本并能够完成这一系列的操纵。
但是现在项目建立脚手架不支持多参数通报,只能经由过程用户输入完成各参数通报的操纵。
因而抛出本文的主角:Expect,以完成一系列的自动化交互行动。

Expect简介

expect是一个免费的编程东西,用来完成自动的交互式使命,而无需工资干涉干与。说白了,expect就是一套用来完成自动交互功用的软件。

在现实工作中,我们运转敕令、剧本或顺序时,这些敕令、剧本或顺序都须要从终端输入某些继承运转的指令,而这些输入都须要工资的手工举行。而应用expect,则能够依据顺序的提醒,模仿规范输入供应给顺序,从而完成自动化交互实行。这就是expect!!!

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。

expect {
    "*yes/no*" {
        send "yes"
        exp_continue
    }
    eof
    {
        send "eof"
    }
}

栗子

未完待续

    原文作者:yvonne
    原文地址: https://segmentfault.com/a/1190000018721090
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞