通过Expect脚本捕捉界面输出并处理实现自动化
in Shell运维 with 1 comment

通过Expect脚本捕捉界面输出并处理实现自动化

in Shell运维 with 1 comment

EXP-expect脚本是适用于交互式操作的脚本,如频繁远程登录&远程下载&定时日志提取。动态匹配界面输出信息来发送相应的处理以达到自动化效果

shell_expect.jpg

预置环境检查

使用expect脚本前需要检查一下环境中是否有expect,直接输入:expect检查

:expect
expect1.1>

EXP脚本原理

EXP脚本由一系列expect-send对组成

expect

send

书写方案

Linux中exp脚本实现有两种主流书写样式:

个人推荐直接EXP格式脚本,避免出现不同sh版本间的兼容问题
两种方式的实际书写风格一致。

脚本案例

EXP脚本非常简单,相当于将你手工的操作过程脚本化
首先你需要手工完成索要执行的工序,并且考虑齐全各种可能出现的输出场景,以保证脚本不会中断
比如远程执行Shell脚本的过程可能出现的:输入密码、确认Yes/no、传入参数、匹配失败等

#在Shell脚本中调用EXP脚本
./login_tool.exp ${ip} ${pwd}

远程上传重置密码脚本的脚本作为示例&说明

#!/usr/bin/expect #指定头文件
#接受参数
set  reip       [lindex $argv 0]
set  rootpsw    [lindex $argv 1]
spawn scp -r resetPsw.sh root@${reip}:./
#实际需要进行捕获的命令(scp -r resetPsw.sh root@${reip}:./),开始捕获
#设定循环flag
set done 0 
#设置超时时间30s
set timeout 30 
    #循环捕获入口
    while {!$done} 
    { 
        expect 
        {
            #捕获写到Password的字符串
            "Password*"
            #输入传入的root密码
            {send "${rootpsw}\r"}
            #捕获出现失败的字符串
            "*failures*"
            #直接退出,返回1
            {exit 1}
            #捕获到上传成功
            "resetPsw*"
            #停止循环
            {set done 1} 
            #超时场景
            Timeout  
            {exit 1}
        }
}
#正常退出
exit 0   
Responses
  1. 坚持

    Reply