2012-07-31 45 views
0

我正在嘗試使用Net :: Telnet登錄某些設備。對於登錄提示,設備一次只需要一個字符來提供登錄和密碼提示。 Ruby一次發送整個用戶名。有沒有辦法將它設置爲一次發送一個字符?獲取Net :: Telnet一次發送一個字符?

這裏是我的腳本:

require 'net/telnet' 
options = Hash.new 
ipaddr = '10.160.64.103' 

date = Time.new.strftime('-%H.%M.%S') 

basedir = '.' 

files = Dir.glob("#{ipaddr}*.log") 

if files.size >= 0 
    File.delete(files[0]) 
end 

file = File.new("#{ipaddr}-telnet#{date}.log", "w") 

tn = Net::Telnet::new("Host"  => ipaddr, 
         "Output_log" => "#{ipaddr}-telnet#{date}.log", 
         "Dump_log" => "dump.log", 
         "Prompt"  => /->\z/) 

options["Name"]   ||= "anonymous" 
options["Password"]  ||= "********" 

tn.login(options) { |c| print c } 

tn.close 

回答

0

我不相信有辦法做到這一點如此簡單的登錄方法,但以下爲login源,我們可以做同樣的事情:

prompt = /->\z/ 
login_prompt = /[Ll]ogin[: ]*\z/ 
password_prompt = /[Pp]ass(?:word|phrase)[: ]*\z/ 

# wait until we've seen a login prompt 
tn.waitfor(login_prompt){|c| print c } 
# print each user character, newline; wait for password prompt 
(user+"\n").each_char{|c| tn.print(c) } 
tn.waitfor(password_prompt){|c| print c } 
# print each pass character, newline; wait for normal prompt 
(pass+"\n").each_char{|c| tn.print(c) } 
tn.waitfor(prompt){|c| print c } 

(請注意,我沒有測試這個)

+0

謝謝!工作!有一個修改:在打印後添加睡眠,或者根據計算機的速度,在相同的數據包中發送幾個字母 – user1564380 2012-07-31 03:18:19