expect是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。
expect自动交互流程:
spawn启动指定进程---expect获取指定关键字---send向指定程序发送指定字符---执行完成退出.
1、apt / yum install -y expect
2、手动安装(Mac系统):
下载tcl:http://www.tcl.tk/software/tcltk/downloadnow84.tml
下载:expect:http://www.linuxfromscratch.org/blfs/view/svn/general/expect.html
https://core.tcl-lang.org/expect/home
分别执行:./configure & make & make install
3、获取expect的路径(需要添加到文件首行):
Linux:which expect
结果:/usr/bin/expect
Mac:where expect
结果:/usr/bin/expect
4、常用API介绍
spawn 交互程序开始后面跟命令或者指定程序 expect 获取匹配信息匹配成功则执行expect后面的程序动作 send exp_send 用于发送指定的字符串信息 exp_continue 在expect中多次匹配就需要用到 send_user 用来打印输出 相当于shell中的echo exit 退出expect脚本 eof expect执行结束 退出 set 定义变量 puts 输出变量 interact 执行完留在远程控制台 set timeout 设置超时时间
5、获得详细文档(将帮助信息保存到expectapi文件中:):
man expect | col -b > expectapi
在线API:https://linux.die.net/man/1/expect
6、demo(scpdemo.sh):
- #!/usr/bin/expect
- spawn scp /etc/fstab wht@172.20.110.199:/home/wht/
- expect {
- "yes/no" { send "yes\n";exp_continue }
- "password" { send "123456wht\n" }
- }
- expect eof
7、注意脚本执行的方法(一点要注意)
·为脚本添加执行权限:sudo chmod +x scpdemo.sh
·执行脚本:./scpdemo.sh
8、初次使用常犯的错:
1、不能按照习惯来用sh scpdemo.sh来这行expect的程序,会提示找不到命令,如下:
autosu.sh: line 2: spawn: command not found
因为expect用的不是bash所以会报错。执行的时候直接./scpdemo.sh就可以了。
#文件开头第一行必须指定expect的路径:#!/usr/bin/expect -d
/usr/bin/expect -d (-d:打开debug模式,方便调试并且观看expect的执行过程)
/usr/bin/expect -f (-f : 其实可加可不加,因为他只是说是从一个文件读取命令,他是一个可选项,仅在使用#!需要添加)
/usr/bin/expect -- (--: 是用来做个限制,限制参数到此为止。也是可加可不加)