expect 用于自动化交互
1.安装
expect是基于 tcl 语言,需要安装tcl
(1)准备tcl,expect源码包
(2)配置编译安装
2.expect的命令
expect的核心是spawn、expect、send、set。
(1)spawn调用要执行的命令 (2)expect监听交互输出 (3)send进行交互输入 (3)set设置变量值 (4)interact交互完后,将控制权交给控制台。 (5)expect eof,与spawn对应,表示捕捉终端输出信息终止,类似if...endif
其他设置
set timeout -1,设置expect永不超时 set timeout 300,如果300后没有捕捉到expect的监听的内容,那么就退出
3.expect的语法
expect使用的是tcl语法
基本如下,
(1)命令之后是参数,互相用空格间隔
cmd arg arg arg
(2)使用变量
set var 1000 # 定义变量
set var [lindex $argv 0] #将 var = argv[0]
$foo
(3)嵌套命令,将一个命令的输出,作为另一个命令的输入参数
cmd1 [cmd2 arg]
(4)双引号,将词组标记为一个参数,双引号内$符号有效
cmd "hello world $foo"
(5)大括号, 将词组标记为一个参数,但大括号内无法扩展变量
cmd {hello world}
(6)反斜线,转义
3.示例:
首先有一个交互程序main.c
#include <stdio.h> int main(int argc, char **argv) { int i = 0; char buf[BUFSIZ] = {0}; for (i = 0; i < argc; i++) printf("argv[%d]:%s\n", i, argv[i]); for (i = 0; i < 4; i++) { printf("input\n"); gets(buf); puts(buf); } return 0; }
使用如下sh
#!/usr/local/tcl/bin/expect spawn ./a.out # 开启子进程,执行a.out expect "input" # 监听 "input" send "xxxx\n" expect "input" send "xxxx\n" expect "input" send "xxxx\n" expect "input" send "xxxx\n" expect eof
exit
使用命令行参数
set var [lindex $argv 0]
将第0个命令参数传给 var
与其他sh连用
由于expect一个独立的shell程序,所以无法写在一个文件,只能通过文件调用。
#!/bin/sh echo "hello world" ./expect.sh
原文:https://www.cnblogs.com/yangxinrui/p/11307720.html