您好,登錄后才能下訂單哦!
通過ruby實現(xiàn)類expect功能的腳本..
在ruby中有2兩種實現(xiàn)方式:
1. 利用標(biāo)準(zhǔn)庫中的Pty基于io流的方式實現(xiàn)(較為復(fù)雜,涉及到輸入輸出io流).
2. 通過rubygems利用擴展包實現(xiàn). 本次主要介紹這個。
首先通過gem安裝軟件包:
在國內(nèi)因為強大的GFW,導(dǎo)致rubygems安裝第三方庫很慢..
先執(zhí)行以下過程,替換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看詳細過程.
以下是一個通過調(diào)用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 產(chǎn)生一個命令的對象并且和它進行交互。也可以通過connect產(chǎn)生一個socket的對象進行交互. exp.procedure do # procedure 是用于一組的模式匹配,一個實例方法,接收一個代碼塊作為參數(shù) any do # any 中指定的所有expect,如果匹配都會被調(diào)用..實際中,主要截獲交互執(zhí)行等,都要在any中進行... expect /continue connecting / do #捕獲提示... //內(nèi)的是正則匹配 send 'yes' #發(fā)送yes end expect /password/ do #捕獲password提示 send "123456" #發(fā)送密碼 end expect /\$\s+$/ do #捕獲用戶提示字符。。 send 'w' #發(fā)送w命令 send 'df' #發(fā)送df命令 end run #輸入過程捕獲的數(shù)據(jù),會將輸出結(jié)果進行回顯.. end any do #退出命令在一個any中時會不執(zhí)行,因此在第二個any block中進行. expect /\$\s+$/ do #執(zhí)行退出.. send 'exit' end run end end
通過以上代碼可以很容易進行擴展,也可以根據(jù)需要增加any block做層次劃分..
主要就是通過expect 截獲輸出,通過send發(fā)送數(shù)據(jù).
還有其他幾個實例屬性:
#before、#buffer、#debug、#last_match、#match
主要是匹配前、緩存中、最后匹配和全部匹配的數(shù)據(jù)..
類方法:
connect(socket, options = {}, &block) 連接到一個socket
spawn(command, options = {}, &block) 產(chǎn)生一個命令并且和它進行交互
實例方法:
expect(*patterns,&block) 通過模式進行匹配..
initialize 通過spawn的工廠方法,直接創(chuàng)建..
procedure(&block) 創(chuàng)建一組的模式匹配, 使用了DSL….
send(command) 發(fā)送一個命令到io的寫句柄
soft_close 等待進程完成或讀句柄關(guān)閉,然后進行清理。會產(chǎn)生阻塞
timeout 獲取當(dāng)前timeout值
timeout=(time) 設(shè)置超時等待的時間,用于expect的匹配
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。