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

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

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

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


首先通过gem安装软件包:

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

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

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



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

#!/usr/bin/rubyrequire'rubygems'#ihatethisline,thereisnothingtosayrequire'ruby_expect'#加载ruby_expectexp=RubyExpect::Expect.spawn('sshkinda22@dbsa.cn-p2188',:debug=>true)#通过spawn产生一个命令的对象并且和它进行交互。也可以通过connect产生一个socket的对象进行交互.exp.proceduredo#procedure是用于一组的模式匹配,一个实例方法,接收一个代码块作为参数anydo#any中指定的所有expect,如果匹配都会被调用..实际中,主要截获交互执行等,都要在any中进行...expect/continueconnecting/do#捕获提示...//内的是正则匹配send'yes'#发送yesendexpect/password/do#捕获password提示send"123456"#发送密码endexpect/\$\s+$/do#捕获用户提示字符。。send'w'#发送w命令send'df'#发送df命令endrun#输入过程捕获的数据,会将输出结果进行回显..endanydo#退出命令在一个any中时会不执行,因此在第二个anyblock中进行.expect/\$\s+$/do#执行退出..send'exit'endrunendend

通过以上代码可以很容易进行扩展,也可以根据需要增加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的匹配