一、expect简介

expect是一种简单的基于Tcl的脚本语言工具,一个可实现自动交互功能的软件套件,其功能就是进行自动化的人机交互;也能够按照脚本内容里面设定的方式与交互式程序进行“会话”的程序,根据脚本内容expect可以知道程序会提示或反馈什么内容以及什么是正确的应答;它是一种可以提供“分支和嵌套结构”来引导程序流程的解释型脚本语言。

shell功能虽然强大,但是不能实现有交互功能的多机器之间的操作例如ssh和ftp,而expect可以帮助我们来实现。

主要功能:实现自动登录远程机器并自动执行命令和shell脚本,结合定时任务可以实现完全自动化!
注意:使用不带密码的密钥验证也可以实现该功能;但没有密钥就只能用远程机器上的账号和密码!

二、expect的安装

安装方式可采用源码和rpm包等安装方式进行,在此以rpm包安装为例进行说明!
[root@expect-lab src]# cat /etc/issue
Red Hat Enterprise Linux Server release 6.2 (Santiago)
Kernel \r on an \m
[root@expect-lab src]# uname -a
Linux expect-lab 2.6.32-220.el6.i686 #1 SMP Wed Nov 9 08:02:18 EST 2011 i686 i686 i386 GNU/Linux
[root@expect-lab src]#ll
total 260

-rw-r--r-- 1 root root 262584 Mar  7  2017 expect-5.44.1.15-5.el6_4.i686.rpm
[root@expect-lab src]# rpm -ivh expect-5.44.1.15-5.el6_4.i686.rpm
warning: expect-5.44.1.15-5.el6_4.i686.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
error: Failed dependencies: libtcl8.5.so is needed by expect-5.44.1.15-5.el6_4.i686

问题:说明缺少tcl库文件,需要安装tcl软件!

[root@expect-lab src]# ll
total 2228
-rw-r--r-- 1 root root  262584 Mar  7  2017 expect-5.44.1.15-5.el6_4.i686.rpm
-rw-r--r-- 1 root root 2012712 Mar  7  2017 tcl-8.5.7-6.el6.i686.rpm

[root@expect-lab src]# rpm -ivh tcl-8.5.7-6.el6.i686.rpm
warning: tcl-8.5.7-6.el6.i686.rpm: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY
Preparing...        ########################################### [100%]  
1:tcl                    ########################################### [100%]
[root@expect-lab src]# rpm -ivh expect-5.44.1.15-5.el6_4.i686.rpm
warning: expect-5.44.1.15-5.el6_4.i686.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
Preparing...            ########################################### [100%]  
1:expect                 ########################################### [100%]
[root@expect-lab src]# expect
expect1.1> exit                 
#说明expect已经安装成功!

三、expect的使用说明

expect的核心命令是spawn expect send set
注意:只有在安装expect后,进入expect环境后才可以执行的expect内部命令!
spawn #调用要执行的命令或脚本
expect #等待命令提示信息的出现,也就是捕捉用户输入的提示
send #发送需要交互的值,替代了用户手动输入内容
set #设置变量值
interact #执行完成后保持交互状态把控制权交给控制台,这个时候就可以手工操作了;如果没有这一句登录完成后会退出,而不是留在远程终端上!
expect eof #这个一定要加,与spawn对应表示捕获终端输出信息终止,类似于if....endif
注意:expect脚本必须以interact或expect eof结束,执行自动化任务通常以expect eof来表示脚本任务执行完毕!
常用语法设置:
set timeout -1 #设置expect永不超时
set timeout 300 #设置expect 300秒超时,如果超过300没有expect内容出现则退出
exp_continue #继续执行接下来的交互操作
$argv 参数数组 #使用[lindex $argv n]获得从bash传递过来的参数(其中n从0开始...,分别表示第1个,第2个...参数)
cmd arg1 arg2 arg3 #说明:命令由空格分隔,cmd是命令名称,其余的是命令参数1,2,3
四、简单实例应用1:

通过expect实现非交互ssh登录,登录后并将ifconfig获取的信息重定向到文件
[root@expect-lab src]# ll
total 2232
-rw-r--r-- 1  root root  262584 Mar  7  2017 expect-5.44.1.15-5.el6_4.i686.rpm
-rwxr-xr-x 1  root root     264 Apr 18 05:06 ssh_exp
-rw-r--r-- 1  root root 2012712 Mar  7  2017 tcl-8.5.7-6.el6.i686.rpm
说明:当前目录下在执行expect脚本之前没有ip_information文件!

root@expect-lab src]# cat ssh_exp
#!/usr/bin/expect
set host "192.168.4.176" #设定远程主机ip
set passwd "passwdstr" #设定ssh登录远程主机的密码
spawn ssh root@$host #执行ssh登录
expect #expect匹配用户输入信息
{
"yes/no" { send "yes\r"; exp_continue } #匹配到""里的内容,发送yes换行并继续
"password:"{ send "$passwd\r"; exp_continue } #匹配到""里的内容,发送密码换行并继续
"#" { send "ifconfig \> /usr/local/src/ip_information\r" } #匹配到""里的内容,发送ifconfig并重定向文件
}
expect eof #结束expect
[root@expect-lab src]# ./ssh_exp
spawn ssh root@192.168.4.176
root@192.168.4.176's password:
Last login: Thu Apr 18 05:07:11 2013 from networker.semico
[root@expect-lab ~]# ifconfig > /usr/local/src/ip_information
以上部分为ssh_exp脚本自动执行的部分!

[root@expect-lab src]# ll

total 2236
-rw-r--r-- 1 root root  262584 Mar  7  2017 expect-5.44.1.15-5.el6_4.i686.rpm
-rw-r--r-- 1 root root     958 Apr 18 05:18 ip_information
-rwxr-xr-x 1 root root     264 Apr 18 05:06 ssh_exp
-rw-r--r-- 1 root root 2012712 Mar  7  2017 tcl-8.5.7-6.el6.i686.rpm
说明:当前目录下在执行expect脚本之后自动生成了ip_information文件!

[root@expect-lab src]# cat ip_information
eth0      Link encap:Ethernet  HWaddr 00:0C:29:04:49:6A
inet addr:192.168.4.176  Bcast:192.168.4.255  Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe04:496a/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:72659 errors:0 dropped:0 overruns:0 frame:0
TX packets:38035 errors:0 dropped:0 overruns:0 carrier:0  collisions:0 txqueuelen:1000
RX bytes:18140682 (17.3 MiB)  TX bytes:13117764 (12.5 MiB)
Interrupt:18 Base address:0x2000
lo Link encap:Local
Loopback   inet addr:127.0.0.1  Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING  MTU:16436  Metric:1
RX packets:119051 errors:0 dropped:0 overruns:0 frame:0
TX packets:119051 errors:0 dropped:0 overruns:0 carrier:0  collisions:0 txqueuelen:0
RX bytes:55243096 (52.6 MiB)  TX bytes:55243096 (52.6 MiB)

说明:本实例通过一个较简单的expect脚本实现了ssh自动非交互登录并在登录成功后将获取的接口信息重定向到了文件ip_information!

转载于:https://blog.51cto.com/380281/1904101

自动化运维脚本语言之expect实践学习(1)相关推荐

  1. python自动化办公 51cto_利用python实现批量自动化运维脚本案例

    本文为通过密码或密钥实现python批量自动化运维脚本案例分享,是老男孩linux培训 python课程教学案例内容,后续会分享多线程并发执行这个脚本的更高级的功能(http://oldboy.blo ...

  2. python工作-Python自动化运维|Python语言工作岗位待遇如何?

    Python是一种计算机程序设计语言.你可能已经听说过很多种流行的编程语言,比如非常难学的C语言,非常流行的Java语言,适合初学者的Basic语言,适合网页编程的Java语言等,Python是他们其 ...

  3. python自动化运维脚本(仅供参考)

    1.生成磁盘使用情况的日志文件 #!/usr/bin/env python#!coding=utf-8import timeimport osnew_time = time.strftime('%Y- ...

  4. Python自动化运维脚本

    1. 生成磁盘使用情况的日志文件 #!/usr/bin/env python #!coding=utf-8import time import osnew_time = time.strftime(' ...

  5. python运维自动化脚本案例-python自动化运维脚本范例

    1.列举当前目录以及所有子目录下的文件,并打印出绝对路径#!/usr/bin/python# coding=utf8import osimport sys if len(sys.argv) < ...

  6. Shell脚本网站监控预警!自动化运维脚本!!!

    一.实验背景 网站被恶意篡改.挂马.暗链怎么办? 网站监控预警系统又叫网站预警机,主要功能是针对政府.高校.各大企业网站所研 发的一款对网站安全进行整体的监控系统,监测内容包括:网站挂马监测.漏洞扫描 ...

  7. LinuxProbe 0x21 使用Ansible服务实现自动化运维

    Ansible是最近几年特别火的一款开源运维自动化工具,它能够帮助运维人员肉眼可见地提高工作效率,并减少人为失误.Ansible有上千个功能丰富且实用的模块,而且有详尽的帮助信息可供查阅,因此即便是小 ...

  8. ansible自动化运维工具

    ansible自动化运维工具 ansible自动化运维脚本工具 ansible自动化运维工具 一.ssh工作原理和基本命令 1.ssh原理 2.ssh的基本命令 二.anible 自动化运维工具 1. ...

  9. oracle税务运维脚本练习,荣欣Linux运维+Oracle DBA初级+高级全套实战训练

    第一阶段:企业版Linux系统运维基础.项目实战:112课时xa0 第二阶段:基于互联网门户Linux应用集群与Mysql数据库集群架构设计与维护,项目实战:112课时 第三阶段:Oracle DBA ...

最新文章

  1. 2018新版正方教务 ---爬虫--- JAVA源码--课表--平时分----成绩-----排名----考试安排...
  2. Spring Boot:使用Rabbit MQ消息队列
  3. 数据预处理|关于标准化和归一化的一切
  4. gitlab mysql启动不了_gitlab不支持mysql,这就是我学习PostgreSQL的原因
  5. android动画影子效果,Android TV常用动画的效果,View选中变大且有阴影(手机也能用)...
  6. 使用urllib2库实现有道翻译
  7. Lamda和kappa架构
  8. MFC开发IM-第八篇、调整各个控件的上下tab顺序
  9. ApacheCN 翻译活动进度公告 2019.3.3
  10. mac为什么不支持ntfs,mac读取ntfs移动硬盘软件有哪些
  11. showtext matlab,使用MATLAB 2019 App Design 工具设计一个 电子日记App
  12. 小视频如何伪原创 抖音合并视频md5
  13. 判断页面是否在微信或者企业微信环境下
  14. 6.0无法一键root吗,root一键root
  15. 【Niagara 02】Tridium N4使用——照明控制案例
  16. Navicat导出数据库表
  17. 基于javaweb的社区居民户籍管理系统(java+ssm+jsp+js+html+mysql)
  18. 互联网安全防护技术综述
  19. 如何写好大型项目的项目周工作汇报
  20. python中fig_matplotlib python:fig.figimage和fig.savefig的图形大小

热门文章

  1. windows操作系统,python环境下django的自动安装
  2. oracle audit文件,oracle 参数文件audit_trail的认识
  3. python打开摄像头cmd_Python调用shell cmd方法代码示例解析
  4. c语言基础教程吕答案,全国计算机等级考试二级教程C语言程序设计课后习题答案.docx...
  5. android view 点击变暗,Android应用开发Android ImageView点击变暗效果
  6. python 二维列表从小到大_给Python开发者准备的110道面试题
  7. QT中让窗口屏幕居中的方法
  8. Bzoj 3226: [Sdoi2008]校门外的区间
  9. 【机器人学与计算机视觉基础】(一)位置与姿态描述 1 位姿的抽象符号表示
  10. nginx源码分析之内存池实现原理