使用expect运行动态脚本

在平时的工作中,如果接手的环境多了之后,每天去尝试连接服务器,都是例行的步骤,时间长了之后就会感觉这些工作都是繁琐重复的工作,其实我们可以尝试让工作更简化,更高效一些。
比如我们设定下面的场景,
我们存在服务器A,这个服务器可以连接到网络环境中的其它机器,我们假定这个机器就是中控机。
通过中控机连接到各个服务器环境,有下面几个步骤,
1)连接到某一台服务器B
2)查看系统的版本信息
3)查看系统的内核信息
4)切换到Oracle用户下
5)查看服务器所使用的Oracle版本

因为切换用户的原因,所以单纯使用ssh来执行命令,第4,5步就没法完成,这个时候我们可以有几种思路来做,一种是通过连接工具录制脚本,比如secureCRT录制一段脚本,操作一遍之后,以后每次执行就需要重放脚本即可。
如果受到工具的限制,或者觉得录制脚本也不够动态,比如有100台服务器,我们就需要录制100个脚本,查找,运行相比而言工作量还是不少,这个时候我们可以使用Linux中的expect命令来DIY
expect是RHEL6版本中自带的一个实用工具,可以校验上个命令执行后的结果集中的关键字,来灵活的运行各种批量处理任务。
expect的交互方式有两种,一种需要以expect eof结尾,另外一种是interact结尾。
这两种方式可以打个比方,比如我们把家比作服务器A,朋友的家比作服务器B,有一天我去给朋友送一个东西,可以把这个比作在服务器B需要的的操作
如果我给朋友送完东西之后,想在朋友家里吃个晚饭,然后一起看一晚上球赛,第二天再回家,这种情况就有点类似interact的方式。
如果我给朋友送完东西之后就回家,朋友邀请吃晚饭也婉拒,这种方式就类似expect eof.
我们来看几个简单的例子。
我们假设下面的脚本为test.sh
需要在脚本前声明 #!/usr/bin/expect,然后使用spawn来启动ssh连接,然后切换到oracle用户,查看系统的版本信息,内核信息,然后查看oracle的版本信息,最后退出,返回到最开始的session
#!/usr/bin/expect
spawn ssh 10.127.133.45
expect "#"
send "su - oracle\r"
send "cat /etc/issue \r"
send "uname -a \r"
send "sqlplus -v \r"
send "exit \r"
send "exit \r"
expect eof
运行命令 ./test.sh, 命令运行的输出结果如下:
spawn ssh 10.xxxx.xxxx.45
Last login: Wed Aug  5 22:06:45 2015 from 10.xxxx.133.xxxx
[root@xxxx_xxxx_45 ~]# su - oracle
[oracle@BX_xxxx_45 ~]$ cat /etc/issue 
Red Hat Enterprise Linux Server release 6.3 (Santiago)
Kernel \r on an \m
[oracle@xxxx_xxxx_45 ~]$ uname -a 
Linux xxxx_xxxx 2.6.32-279.el6.x86_64 #1 SMP Wed Jun 13 18:24:36 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux
[oracle@xxxx_xxxx_45 ~]$ sqlplus -v 
SQL*Plus: Release 11.2.0.4.0 Production
[oracle@xxxx_xxxx_45 ~]$ exit 
logout
[root@xxxx_xxxx_45 ~]# exit 
logout
Connection to 10.xxxx.xxxx.45 closed.
可以看到其实就是连接到目标环境中,执行完命令之后返回原来的session.
再来看一个interact的例子,比如我们存在大量的用户,需要通过快捷方式登录到指定的机器上,查看服务器名,然后连入oracle用户,查看数据库版本。
#!/usr/bin/expect
spawn ssh 10.xxxx.0.63
expect "#"
send "su - oracle\r"
send "cat /etc/issue \r"
send "uname -a \r"
send "cat /etc/hosts|grep `hostname` \r"
send "sqlplus -v \r"
interact
命令的运行结果如下:
spawn ssh 10.127.0.63
Last login: Wed Aug  5 22:43:58 2015 from 10.127.133.86
[root@xxxx ~]# su - oracle
[oracle@xxxx ~]$ cat /etc/issue 
Red Hat Enterprise Linux Server release 5.3 (Tikanga)
Kernel \r on an \m
[oracle@xxxx ~]$ uname -a 
Linux xxxx.com 2.6.18-194.el5 #1 SMP Tue Mar 16 21:52:39 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux
[oracle@xxxx ~]$ cat /etc/hosts|grep `hostname` ; 
10.127.xxxx.63     xxxx.com  #Primary
10.127.xxxx.82   xxxx.com  #Standby
[oracle@xxxx ~]$ sqlplus -v ;
ps -ef|grep smon 
SQL*Plus: Release 11.2.0.3.0 Production
这个时候我们已经连入了那个目标环境,可以继续在这个基础上进行其它的操作。
在这个基础上稍微扩展一下,我们可以把expect和shell变量联系起来
比如我们有100台服务器,我们只需要输入IP地址即可,然后后面会自动去切换用户,检查内核参数,系统参数等等。
只需要修改下面的两个部分即可,整个脚本一下子就动态起来了。
#!/usr/bin/expect
set ip_addr [lindex $argv 0] 
spawn ssh $ip_addr 
expect "#"
send "su - oracle\r"
send "cat /etc/issue \r"
send "uname -a \r"
send "cat /etc/hosts|grep `hostname` ; \r"
send "sqlplus -v ;\r"
send "ps -ef|grep smon \r"
interact

时间: 2024-09-29 12:30:49

使用expect运行动态脚本的相关文章

如何通过Linux命令行使用和运行PHP脚本_php实例

下面通过图文并茂的方式给大家分享下通过Linux命令使用和运行PHP脚本. PHP是一个开源服务器端脚本语言,最初这三个字母代表的是"Personal Home Page",而现在则代表的是"PHP:Hypertext Preprocessor",它是个递归首字母缩写.它是一个跨平台脚本语言,深受C.C++和Java的影响. 在 Linux 命令行中运行 PHP 代码 PHP的语法和C.Java以及带有一些PHP特性的Perl变成语言中的语法十分相似,它当下大约正被

javascript 动态脚本添加的简单方法_javascript技巧

异步加载js文件或者异步加载js模块,支持所有浏览器,包括IE,参考至javascript高级编程 1.createScript方法用于创建一个script标签并添加到body标签中 2.createModule方法用于创建一个script脚本的标签,并且如果在IE8以下的版本运行会抛出异常,在异常捕获模块中执行script.text兼容IE添加js的脚本内容. <button id="demo">js文件</button> <button id=&quo

Python实现保证只能运行一个脚本实例

  这篇文章主要介绍了Python实现保证只能运行一个脚本实例,本文直接给出实现代码,需要的朋友可以参考下 保证只能运行一个脚本实例,方法是程序运行时监听一个特定端口,如果失败则说明已经有实例在跑. 使用装饰器实现,便于重用 代码如下: import functools def just_one_instance(func): ''' 装饰器 如果已经有实例在跑则退出 复制代码 代码如下: :return: ''' @functools.wraps(func) def f(*args,**kwa

如何运行PowerShell脚本

  新版本的PowerShell随着Windows Server 2012 R2到来.现在,使用PowerShell 4.0的唯一途径就是获取并使用Windows Management Framework 4.0. PowerShell在Windows虚拟化任务方面能发挥最大帮助和用途.现在网上有关于此话题的资料库,最热的是TechNet博客中的一个五部分的系列文章.通过这些信息,你可以找到大量有关PowerShell脚本自动化多虚拟化设置.配置和维护任务的相关细节. TechNet系列文章提供

在Win7环境下perforce如何运行 python脚本

问题描述 在Win7环境下perforce如何运行 python脚本 我运行后总是显示这样的错误 : c:/python28/python: can't open file 'mail.py': [Errno 2] No such file or directory 解决方案 用绝对路径,看上去是py文件路径不对

嵌入式linux中设置开机运行shell脚本的问题

问题描述 嵌入式linux中设置开机运行shell脚本的问题 想写一个设置静态ip的开机自运行的shell脚本,然后百度说放在rc.local什么的文件里,然后我的板子里/etc 下根本没有这个文件,请大神们指点我应该怎么办? /etc 下只有fstab hosts host.conf group init.d inittab ld.so.conf mdev.conf profile passwd resolv.conf services 解决方案 输入命令 vi /etc/network/in

inux下的jython-Linux下运行jython脚本不识别jar包里的package名,报错,no modle ..

问题描述 Linux下运行jython脚本不识别jar包里的package名,报错,no modle .. Linux下运行jython脚本不识别jar包里的package名,报错,no modle ..Windows下可以 解决方案 可能是没有安装setuptools这个模块 http://pypi.python.org/pypi/setuptools 这个地方下载setuptools-0.6c11-py2.7.egg文件到本地,使用chmod +x setuptools-0.6c11-py2

Ubuntu登录菜单GNOME与运行Xclient脚本的差异分析

大家是否出现过这种情况,当你输入完用户名,密码后,就要开始漫长的等待,少则30秒,多者一两分钟. 而且当进入系统后,却没有桌面,http://www.aliyun.com/zixun/aggregation/29863.html">panel倒是有的.这时如果你查看进程,(可以用终端命令ps,或者图形工具gnome-system-monitor等等),会发现nautilus进程占用了很高的进程,这说明nautilus桌面管理程序它是启动了,可是异常了.我相信这是7.04,7.10版本的一个

MySQL运行外部脚本的那些坑

今天从cmd命令行运行MySQL脚本.sql,参照网上教程,大致如下两种方法: 未登录:D:\mysql\bin\mysql –uroot –p123456 -Dtest<d:\test\ss.sql 登陆:Mysql>source d:\test\ss.sql 各种不要引号.单引号.双引号均报错, ERROR: Failed to open file ''E:\t_user.sql'', error: 22 事实上该如何操作呢? 未登录状态: mysql -uroot -p -P3307 -