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