📖Linux中的交互式脚本expect实现自动化处理

发布: 2015-05-29
热度: 56
趋势: 56
权重: 6
🎯

expect脚本由一系列expect-send对组成,等待输出中输出特定的字符,通常是一个提示符,然后发送特定的响应,特别适用于需要批量手动输入命令的自动化操作改造

expect

expect 是一种可以用于交互式操作的脚本,来完成比如频繁远程登录&远程下载&定时日志提取等操作。

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

expect 等待输出中输出特定的字符,通常是一个提示符,然后发送特定的响应。

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

expect1.1>

编写方式

梳理正常执行某些操作所需要的命令、步骤、顺序、以及可能产生分支判断。

将命令逐一添加到脚本中,通过控制台反馈内容来判定走向哪个分支。

书写习惯

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

  1. 直接写在 sh 中
  2. 独立写在 exp 文件

个人推荐直接 exp 文件格式脚本,避免出现不同 sh 版本间的兼容问题。

两种方式的实际书写风格一致。

脚本实例

shell 脚本调用 exp 文件

exp 脚本可以在 shell 脚本中调用

./sendResetPwd.exp ${ip} ${pwd}

远程上传一键密码更新脚本

如果我们有多个环境需要一键更新密码的时候:

  1. 在一个操作环境上配置好所有远程环境的账号密码(可以从文件读取)
  2. 循环调用本实例 exp 脚本完成全部改密脚本的上传
  3. 建立一个类似的 exp 脚本主要通过 ssh 远程执行 resetPsw.sh

以下实现远程上传一个一键改密 Shell 脚本(resetPsw.sh))作为示例&说明:

(实例中的中文注释是为了方便阅读,实际 linux 环境中不建议出现中文字符)

#指定头文件
#!/usr/bin/expect
#接受脚本入参 IP和需要修改后的密码
set  reip       [lindex $argv 0]
set  rootpsw    [lindex $argv 1]
#上传一键改密脚本至远程服务器
#实际需要进行捕获的命令(scp -r resetPsw.sh root@${reip}:./),开始捕获
spawn 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}
        }
}
#正常退出 异常退出1已在上方退出
exit 0   

补充优化

类似这种远程批量行为,为了避免脚本执行异常,建议互相添加白名单实现免密访问,无需配置密码文件,可以大大提交执行效率。

同理,互相添加白名单也可以通过 expect 实现,远程互相拷贝公钥。

当前文章暂无讨论,留下脚印吧!
大纲
  • expect
    • 编写方式
  • 书写习惯
  • 脚本实例
    • shell 脚本调用 exp 文件
    • 远程上传一键密码更新脚本
  • 补充优化
提交成功,请等待审核通过后全面展示!

发表评论

昵称
邮箱
链接
签名
评论

温馨提示:系统将通过浏览器临时记忆您曾经填写的个人信息且支持修改,评论提交后仅自己可见,内容需要经过审核后方可全面展示。

选择头像