当前位置:  数据库>oracle

使用expect运行动态脚本

    来源: 互联网  发布时间:2017-06-19

    本文导语: 在平时的工作中,如果接手的环境多了之后,每天去尝试连接服务器,都是例行的步骤,时间长了之后就会感觉这些工作都是繁琐重复的工作,其实我们可以尝试让工作更简化,更高效一些。 比如我们设定下面的场景, 我们存...

在平时的工作中,如果接手的环境多了之后,每天去尝试连接服务器,都是例行的步骤,时间长了之后就会感觉这些工作都是繁琐重复的工作,其实我们可以尝试让工作更简化,更高效一些。

比如我们设定下面的场景,

我们存在服务器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 - oracler"
 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 - oracler"
 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 - oracler"
 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


    
 
 

您可能感兴趣的文章:

  • shell 脚本中命令别名在脚本外无法使用
  • nohup执行的shell脚本,全局变量不能传递到脚本中使用吗?
  • 关于unix使用参数导致脚本输出异常(与脚本内直接带参数输出结果不同)
  • 如何在Linux下使用脚本实现程序的自动重启!望各位详解!
  • 大家好,我想问下有人用过"linux进程的内存使用解析"中推荐使用的"Ben Maurer写的perl脚本"查看内存么
  • 如何在使用命令行去修改系统脚本?
  • 有没有方法可以使用脚本批量修改bash环境变量
  • 如何在shell脚本中使用source命令?
  • Ubuntu下Shell脚本中[]的使用
  • 使用脚本向进程发出命令
  • linux使用shell脚本,如何创建用户,并设置用户密码?能否给出示例?
  • 急!!!AIX上监控CPU和内存使用率的脚本
  • linux系统使用python获取内存使用信息脚本分享
  • linux下使用shell脚本编译java报错?
  • oracle使用sql脚本生成csv文件案例学习
  • ORACEL使用脚本来修改表结构
  • shell脚本参数使用问题
  • 使用iconv批量改变文件编码的shell脚本
  • 使用sh脚本如何替换指定目录下所有文件中的指定字符串
  • 求助:使用sh脚本,把文件1.txt中的A都替换成B
  • 有谁使用JRun,为何可以运行Servlet,却不能运行jsp?
  • 用Jbuilder3 遇到问题不能运行把可疑代码注掉后可以运行但是重新使用可疑代码时又可以运行了多次重复都是如此
  • 在windows下使用虚拟机运行linux,在不插入网线的状态下可不可以使用smb服务
  • 菜鸟问题,小弟刚刚使用LINUX不久,不知道如何使用编程工具进行编译和运行!
  • redhat ent 4 u4上,如何象readhat ent3 u6版本那样使用top可以查看每个逻辑CPU的利用率以及运行进程的资源使用情况?
  • 怎样在jbuilder中使用命令窗口运行java 程序?
  • UNIX下使用java运行class的问题
  • 我在linux8.0下装了mysql,已经运行进程mysqld,但怎么设置和使用它呢?
  • 使用JavaScript实现的Flash运行环境 Gordon
  • LINUX 下使用QT开发的程序如何才能让它在没有安装QT的Linux系统下运行?
  • 使用信号量如何让父子进程交替运行?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux能否使用*.DLL型动态链接库
  • 64位机器上使用32位动态库的
  • linux下动态库中如何导出对象进行使用
  • 如何使用JAVA调用利用用VC写的已有的动态库
  • 请教linux9。0中使用动态链接库的问题
  • [请教]如何使用openssl的动态库
  • gtkmenuitem使用,我想动态改变菜单上面的文字,就像delphi的caption一样,应该怎样做
  • 多线程中动态链接库的使用
  • AIX下gcc编译器怎么使用动态连接库
  • 请问:在UINX如何编写、使用动态连接库???
  • vc编写dll动态连接库(编译过的)能在unix上开发使用吗?
  • unix 如何使用xlC_r把程序编译成动态链接库
  • 静态库动态库同时存在时,如何指定使用静态库
  • RedHat Linux 9.0下编译的动态库在7.3下不能使用?
  • 如何使用kdevelop创建动态共享库程序,请高手指点
  • 动态连接库的使用问题
  • 请问怎样使用动态连接库?unix/c
  • 我想在程序中动态得到系统资源使用情况
  • 动态库的使用问题
  • Linux下写服务程序,程序可以使用配置文件动态链接库吗?
  • C++ I/O 成员 tellg():使用输入流读取流指针
  • 在测试memset函数的执行效率时,分为使用Cash和不使用Cash辆种方式,该如何控制是否使用缓存?
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • 求ibm6000的中文使用手册 !从来没用过服务器,现在急需使用它,不知如何使用! 急!!!!!
  • Python不使用print而直接输出二进制字符串
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • Office 2010 Module模式下使用VBA Addressof
  • 急求结果!!假设一个有两个元素的信号量集S,表示了一个磁带驱动器系统,其中进程1使用磁带机A,进程2同时使用磁带机A和B,进程3使用磁带机B。
  • java/j2ee iis7站长之家
  • c#中SAPI使用总结——SpVoice的使用方法
  • tcmalloc内存泄露优化c++开源库下载,安装及使用介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3