让Net :: Telnet一次发送一个角色?

时间:2012-07-31 00:04:06

标签: ruby telnet

我正在尝试使用Net :: Telnet登录某些设备。对于登录提示,设备一次需要一个字符用于登录和密码提示。 Ruby立即发送整个用户名。有没有办法将它设置为一次发送一个字符?

这是我的剧本:

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

1 个答案:

答案 0 :(得分: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 }

(请注意,我没有对此进行测试)