溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

ruby_expect模塊的使用..

發(fā)布時間:2020-06-16 21:56:35 來源:網(wǎng)絡(luò) 閱讀:6461 作者:kinda22 欄目:編程語言

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


向AI問一下細節(jié)

免責(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)容。

AI