shell脚本-expect
一、概述
Expect是建立在tcl基础上的一个工具,Expect 是用来进行自动化控制和测试的工具。主要解决shell脚本中不可交互的问题。
在一些需要交互输入指令的场景下, 可通过脚本设置自动进行交互通信. 其交互流程是: spawn启动指定进程 -> expect获取指定关键字 -> send想指定进程发送指定指令 -> 执行完成, 退出.
在linux运维和开发中,我们经常需要远程登录服务器进行操作,登录的过程是一个交互的过程,可能会需要输入yes/no password等信息。为了模拟这种输入,可以使用Expect脚本,由于expect是基于tcl的, 所以需要确保系统中安装了tcl。
# 检查是否安装了tcl、expect rpm -qa |grep tcl rpm -qa |grep expect # 如果没有安装, 使用yum安装tcl和expect: yum install -y tcl yum install -y expect # 查看expect的安装路径: command -v expect
二、expect常用命令
命 令 | 说 明 |
spawn | 启动新的交互进程, 后面跟命令或者指定程序 |
expect | 从进程中接收信息, 如果匹配成功, 就执行expect后的动作(判断上次输出结果里是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回。只能捕捉由spawn启动的进程的输出) |
send | 向进程发送字符串,用于模拟用户的输入,该命令不能自动回车换行,一般要加 \r(回车) |
send exp_send | 用于发送指定的字符串信息 |
exp_continue | 在expect中多次匹配就需要用到 |
send_user | 用来打印输出 相当于shell中的echo |
interact | 允许用户交互,执行完成后保持交互状态,把控制权交给控制台 |
exit | 退出expect脚本 |
eof | expect执行结束, 退出 |
set | 定义变量 |
puts | 输出变量 |
timeout | 设置超时时间,过期则继续执行后续指令 |
$argv 参数数组 | Expect脚本可以接受从bash传递的参数.可以使用[lindex $argv n]获得,n从0开始,分别表示第一个,第二个,第三个…参数 |
示例:远程ssh另一台主机
#!/usr/bin/expect set ip 192.168.xxx.xxx set pass 123456 set timeout 10 spawn ssh root@$ip expect { "yes/no" { send "yes\r";exp_continue } "password:" { send "$pass\r" } } interact # interact 这个写在最后代表交互,如果不写执行完动作就会退出 脚本执行方式: # ./expect.sh # /shell/expect.sh # expect -f expect.sh