交互式脚本expect脚本实现自动化

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

所属分类 Linux

相关标签 自动化脚本expect批量

expect

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

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

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

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

expect1.1>

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

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

书写习惯

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

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

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

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

脚本实例

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实现,远程互相拷贝公钥。

米虫

做一个有理想的米虫,伪全栈程序猿,乐观主义者,坚信一切都是最好的安排!

本站由个人原创、收集或整理,如涉及侵权请联系删除

本站内容支持转发,希望贵方携带转载信息和原文链接

本站具有时效性,不提供有效、可用和准确等相关保证

本站不提供免费技术支持,暂不推荐您使用案例商业化

发表观点

提示

昵称

邮箱

QQ

网址

当前还没有观点发布,欢迎您留下足迹!

同类其他

Linux

通过ulimit命令解决Too many open files

项目启动报错:Too many open files,通过ulimit命令可以查看与管理用户/程序/进程占用资源情况,其中比较实用的是可以根据资源情况配置linux用户的最大进程数

Crontab配置定时任务处理日常工作

Linux服务器测试环境或正式生产环境常常设计一些定时例行处理的操作,如日记备份转移清理等,利用Crontab+Shell脚本组合实现定期定时操作,确保不会应工作繁忙忘记任务导致环境异常

多环境间信任关系添加的完整与快捷流程

项目上的开发和测试环境非常多,少则数十多则上百,实际工作中实在懒得来回登录或打开各个环境,最好的方案就是给内网环境间添加一下信任关系,便于快速在环境之间切换,免去输入密码的烦恼

Shell脚本循环逐行读取文件

Shell脚本循环读取文件常用的方案有输入重定向和管道操作,循环形式有while和for两种,具体的使用或搭配看个人习惯,个人尚未对命令进行性能验证

关键:Linux系统磁盘挂载

Linux系统一般情况下启动默认只加载系统盘,支持其他磁盘自由热插拔,如果发现自己的某些目录找不见了的时候不要慌看看是不是没有设置开机启动自动加载挂载磁盘内容,另外要特别注意首次安装系统记得磁盘挂载操作

Comm语法简单实用的文本文件对比工具

Linux系统的Comm命令可以方便快捷的对比文本文件并输出差异结果,使用该命令需要一个前提最好先对文件进行排序,否则输出的差异结果一言难尽,因此会比较适合数据库导出数据的对比

选择个人头像

昵称

邮箱

QQ

网址

评论提示

  • 头像:系统为您提供了12个头像自由选择,初次打开随机为你选择一个
  • 邮箱:可选提交邮箱,该信息不会外泄,或将上线管理员回复邮件通知
  • 网址:可选提交网址,评论区该地址将以外链的形式展示在您的昵称上
  • 记忆:浏览器将记忆您已选择或填写过得信息,下次评论无需重复输入
  • 审核:提供一个和谐友善的评论环境,本站所有评论需要经过人工审核