重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
通过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的匹配