expect脚本实现Linux自动化操作(远程一键改密)

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

expect脚本实现Linux自动化操作(远程一键改密)

所属分类: Linux
专题标签: 脚本 自动化 远程

EXP-expect

Linux采用EOF实现一键改密脚本(附密码相关维护命令)一文中,我们提到一键改密脚本适用于远程批量执行密码更新操作。
本文正是使用一种可以用于交互式操作的脚本,来完成比如频繁远程登录&远程下载&定时日志提取等操作。
EXP脚本由一系列expect-send对组成。
expect等待输出中输出特定的字符,通常是一个提示符,然后发送特定的响应。
使用expect脚本前需要检查一下环境中是否有expect,直接输入:expect 检查

  1. expect1.1>

书写习惯

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

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

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

Shell脚本调用Exp

EXP脚本可以在Shell脚本中调用

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

EXP脚本实例

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

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

以下实现远程上传一个一键改密Shell脚本作为示例&说明:
一键改密脚本使用EOF实现请参考Linux采用EOF实现一键改密脚本(附密码相关维护命令)

  1. #指定头文件
  2. #!/usr/bin/expect
  3. #接受脚本入参 IP和需要修改后的密码
  4. set reip [lindex $argv 0]
  5. set rootpsw [lindex $argv 1]
  6. #上传一键改密脚本至远程服务器
  7. #实际需要进行捕获的命令(scp -r resetPsw.sh root@${reip}:./),开始捕获
  8. spawn scp -r resetPsw.sh root@${reip}:./
  9. #设定循环flag
  10. set done 0
  11. #设置超时时间30s
  12. set timeout 30
  13. #循环捕获入口
  14. while {!$done} {
  15. expect {
  16. #捕获写到Password的字符串
  17. "Password*"
  18. #输入传入的root密码
  19. {send "${rootpsw}r"}
  20. #捕获出现失败的字符串
  21. "*failures*"
  22. #直接退出,返回1
  23. {exit 1}
  24. #捕获到上传成功
  25. "resetPsw*"
  26. #停止循环
  27. {set done 1}
  28. #超时场景
  29. Timeout
  30. {exit 1}
  31. }
  32. }
  33. #正常退出 异常退出1已在上方退出
  34. exit 0

其他

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