通過ruby實(shí)現(xiàn)類expect功能的腳本..
成都創(chuàng)新互聯(lián)專注于金山網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供金山營銷型網(wǎng)站建設(shè),金山網(wǎng)站制作、金山網(wǎng)頁設(shè)計(jì)、金山網(wǎng)站官網(wǎng)定制、小程序開發(fā)服務(wù),打造金山網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供金山網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。在ruby中有2兩種實(shí)現(xiàn)方式:
1. 利用標(biāo)準(zhǔn)庫中的Pty基于io流的方式實(shí)現(xiàn)(較為復(fù)雜,涉及到輸入輸出io流).
2. 通過rubygems利用擴(kuò)展包實(shí)現(xiàn). 本次主要介紹這個(gè)。
首先通過gem安裝軟件包:
在國內(nèi)因?yàn)閺?qiáng)大的GFW,導(dǎo)致rubygems安裝第三方庫很慢..
先執(zhí)行以下過程,替換gem sources。
gem sources -a https://ruby.taobao.org/ #添加淘寶源 gem sources –remove https://rubygems.org/ #刪除默認(rèn)源 gem sources -l #查看gems源,有淘寶就OK… gem install ruby_expect #安裝gem包,可以加個(gè)-V看詳細(xì)過程.
以下是一個(gè)通過調(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)生一個(gè)命令的對(duì)象并且和它進(jìn)行交互。也可以通過connect產(chǎn)生一個(gè)socket的對(duì)象進(jìn)行交互. exp.procedure do # procedure 是用于一組的模式匹配,一個(gè)實(shí)例方法,接收一個(gè)代碼塊作為參數(shù) any do # any 中指定的所有expect,如果匹配都會(huì)被調(diào)用..實(shí)際中,主要截獲交互執(zhí)行等,都要在any中進(jìn)行... 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ù),會(huì)將輸出結(jié)果進(jìn)行回顯.. end any do #退出命令在一個(gè)any中時(shí)會(huì)不執(zhí)行,因此在第二個(gè)any block中進(jìn)行. expect /\$\s+$/ do #執(zhí)行退出.. send 'exit' end run end end
通過以上代碼可以很容易進(jìn)行擴(kuò)展,也可以根據(jù)需要增加any block做層次劃分..
主要就是通過expect 截獲輸出,通過send發(fā)送數(shù)據(jù).
還有其他幾個(gè)實(shí)例屬性:
#before、#buffer、#debug、#last_match、#match
主要是匹配前、緩存中、最后匹配和全部匹配的數(shù)據(jù)..
類方法:
connect(socket, options = {}, &block) 連接到一個(gè)socket
spawn(command, options = {}, &block) 產(chǎn)生一個(gè)命令并且和它進(jìn)行交互
實(shí)例方法:
expect(*patterns,&block) 通過模式進(jìn)行匹配..
initialize 通過spawn的工廠方法,直接創(chuàng)建..
procedure(&block) 創(chuàng)建一組的模式匹配, 使用了DSL….
send(command) 發(fā)送一個(gè)命令到io的寫句柄
soft_close 等待進(jìn)程完成或讀句柄關(guān)閉,然后進(jìn)行清理。會(huì)產(chǎn)生阻塞
timeout 獲取當(dāng)前timeout值
timeout=(time) 設(shè)置超時(shí)等待的時(shí)間,用于expect的匹配
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。