Shell脚本 免交互expect
Expext概述
Expect是建立在tcl基础上的一个工具,Expect是用来自动化控制和测试的工具。主要解决shell脚本中不可交互的问题。有助于大规模的系统运维工作。在日常的运维与开发中,常常需要运城登录到服务器,然而登录的过程却是个需要交互的过程,可能会要输入yes/no等信息,使用Expect脚本即可实现免交互操作。
set timeout 20 //登录超时多少秒退出
log_file test.log //日志记录操作
log_user 1 //1为屏幕输出信息,0为不输出
expect基本命令
expect安装
系统一般不自带,需要自己安装 安装命令
yum -y install expect
expect流程命令
spawn:启动进程,并跟踪后续交互信息 send:向进程发送字符串,用于模拟用户的输入 该命令不能自动回车换行,一般要加、r(回车) expect expect的一个内部命令,
判断上次输出结果里是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回 只能捕捉有spawn启动的进程的输出
interact:执行完成后保持交互状态,把控制权交给控制台
expect内容命令
Timeout:指定超时时间,过期则继续执行后续指令
单位是:秒
timeout -1为永不超时
默认情况下,timeout是10秒exp_continue
允许expect继续向下执行指令send_user
回显命令,相当于echo
expect其他命令
$argv参数数组 Expect脚本可以接受从bash传递的参数,可以使用[lindex $argc n]获得,n从0开始,分别表示第一个,第二个,第三个…参数
arg:参数
v:value Expect脚本的结尾 expect脚本必须以interact或expect eof结束,执行自动化任务通常expect eof就够了 expect eof是在等待结束标志。由spawn启动的命令在结束时会产生一个eof标记,expect eof就是在等待这 个标记
Expect执行方式
[root@localhost ~]# vim b.sh
#!/usr/bin/expect //Expect二进制文件的路径
#超时时间
set timeout 20 //20秒等待时间
log_file test.log //日志文件
log_user 1 //日志用户
#参数传入
set hostname [lindex $argv 0] //追加参数0,统计变量并加载第1位置参数
set password [lindex $argv 1] //追加参数1,统计变量并加载第2位置参数
#追踪命令
spawn ssh root@$hostname //追踪命令
#捕捉信息并匹配免交互执行
expect { //捕捉提示信息
"Connection refused" exit //捕捉到拒接连接信息即退出
"service not konwn" exit //捕捉到服务为开启信息即退出
"(yes/no)" // 捕捉yes或no参数
{send "yes\r";exp_continue} //输入yes并继续执行
"*password" // 捕捉参数
{send "$password\r"} //输入密码参数
}
#控制权交予控制台
interact //控制权转交控制台人为输入
exit //退出脚本
[root@localhost ~]# chmod +x a.sh //授予脚本执行权限
[root@localhost ~]# ./a.sh 192.168.235.134 123123 //运行脚本远程连接
spawn ssh root@192.168.235.134
root@192.168.235.134's password:
Last login: Thu Oct 10 15:13:27 2019 from 192.168.235.1 //已成功远程登录
[root@localhost ~]# exit
登出
Connection to 192.168.235.134 closed. //退出远程登录