通過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的匹配