ruby_expect模块的使用..-创新互联

通过ruby实现类expect功能的脚本..

成都创新互联专注于金山网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供金山营销型网站建设,金山网站制作、金山网页设计、金山网站官网定制、小程序开发服务,打造金山网络公司原创品牌,更为您提供金山网站排名全网营销落地服务。

在ruby中有2两种实现方式:

1. 利用标准库中的Pty基于io流的方式实现(较为复杂,涉及到输入输出io流).

2. 通过rubygems利用扩展包实现. 本次主要介绍这个。

首先通过gem安装软件包:

     在国内因为强大的GFW,导致rubygems安装第三方库很慢..

     先执行以下过程,替换gem sources。

gem sources -a https://ruby.taobao.org/      #添加淘宝源
gem sources –remove https://rubygems.org/   #删除默认源
gem sources -l          #查看gems源,有淘宝就OK…
gem install ruby_expect    #安装gem包,可以加个-V看详细过程.

以下是一个通过调用ssh命令的过程:

#!/usr/bin/ruby
require 'rubygems'                 # i hate this line, there is nothing to say
require 'ruby_expect'              # 加载ruby_expect
exp = RubyExpect::Expect.spawn('ssh kinda22@dbsa.cn -p 2188',:debug => true)                                        #通过spawn 产生一个命令的对象并且和它进行交互。也可以通过connect产生一个socket的对象进行交互.
exp.procedure do                   # procedure 是用于一组的模式匹配,一个实例方法,接收一个代码块作为参数
  any do                           # any 中指定的所有expect,如果匹配都会被调用..实际中,主要截获交互执行等,都要在any中进行...
    expect /continue connecting / do       #捕获提示... //内的是正则匹配
      send 'yes'                           #发送yes
    end
    expect /password/ do                   #捕获password提示
      send "123456"                        #发送密码
    end
    expect /\$\s+$/ do                     #捕获用户提示字符。。
      send 'w'                             #发送w命令
      send 'df'                            #发送df命令
    end
    run                                    #输入过程捕获的数据,会将输出结果进行回显..
  end
  any do                                   #退出命令在一个any中时会不执行,因此在第二个any block中进行.
    expect /\$\s+$/ do                     #执行退出..
      send 'exit'
    end
  run
  end
end

   通过以上代码可以很容易进行扩展,也可以根据需要增加any block做层次划分..

   主要就是通过expect 截获输出,通过send发送数据.

还有其他几个实例属性:

#before、#buffer、#debug、#last_match、#match

主要是匹配前、缓存中、最后匹配和全部匹配的数据..

类方法:

connect(socket, options = {}, &block) 连接到一个socket

spawn(command, options = {}, &block) 产生一个命令并且和它进行交互

实例方法:

expect(*patterns,&block) 通过模式进行匹配..

initialize  通过spawn的工厂方法,直接创建..

procedure(&block)  创建一组的模式匹配, 使用了DSL….

send(command)  发送一个命令到io的写句柄

soft_close  等待进程完成或读句柄关闭,然后进行清理。会产生阻塞

timeout    获取当前timeout值

timeout=(time)  设置超时等待的时间,用于expect的匹配

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


新闻名称:ruby_expect模块的使用..-创新互联
文章起源:http://pwwzsj.com/article/dsccpi.html