当前位置: 首页 > 后端技术 > Node.js

使用Expect实现自动化交互

时间:2023-04-03 10:14:13 Node.js

*前面写的一个最近开发的项目希望实现这样的功能。本地项目创建脚手架放在远程服务器上。当用户需要创建项目时,只需要在提供的页面上填写一些基本的项目配置并提交即可。后台会根据选择自动创建项目并推送到仓库。乍一看,这似乎是一个非常简单的需求。我们只需要在用户发起创建请求时调用后台的shell脚本,就可以实现这一系列操作。但是目前的项目创建脚手架不支持多参数传递,每个参数传递的操作只能通过用户输入完成。于是抛出本文的主角:Expect,以实现一系列自动化的交互动作。关于ExpectExpect是一种免费的编程工具,无需人工干预即可自动执行交互式任务。说白了,expect就是一套用来实现自动交互功能的软件。在实际工作中,当我们运行命令、脚本或程序时,这些命令、脚本或程序都需要从终端输入一些指令才能继续运行,而这些输入都需要手动完成。借助expect,可以根据程序的提示,模拟提供给程序的标准输入,从而实现自动交互执行。这是期待!!!Expect命令使用expect时,首先需要在文件顶部写上#!/usr/bin/expect,告诉进程这是一个expect文件。在脚本编写中,基本上离不开下面的“六”个命令。spawn启动一个新的进程expect用于等待一个进程的反馈,我们根据进程的反馈发送相应的交互命令send发送需要交互的值,输入手动交互Expect语法expect使用tcl语法,详细教程请参考TCL基础语法-Tcl教程这里有几个简单的流程控制,一般够用了。期望参数的值存放在$argv中,比如第一个参数是[lindex$argv0],以此类推。//执行命令xxx.shmike22engineer#!/usr/bin/expectsetname=[lindex$argv0]setage=[lindex$argv1]setjob=[lindex$argv2]if/elseif{$a=='a'}{setflag=0}else{setflag=1}expect'*请输入xxx*的值'send$flag循环匹配一般来说,如果expect匹配成功,就会退出语句,而exp_continue表示循环匹配。匹配修改后的关键字后,从头继续匹配。比如安装软件时需要输入多个yes。expect{"*yes/no*"{send"yes"exp_continue}eof{send"eof"}}栗子未完待续