我有一个项目,我需要通过telnet通过一系列命令更新数千个设备。这些命令不会破坏或导致设备脱机(登录,应用命令,注销)。
我在SNMP适用的地方广泛使用snmp4em。这里的阻止方法将永远存在。
我不熟悉线程,EventMachine(其核心)等,试图从头开始接近这一点。
我一直在看em-simple_telnet。它似乎具有我需要的功能,我的问题是错误编码。如果主机无法访问或登录失败,则会在代码的最高级别(EventMachine.run do
)引发错误,我发现这很难rescue
。
也许我有一个金发碧眼的时刻,但我没有看到解决方案。只要没有失败,以下代码就可以工作。
require 'em-simple_telnet'
File.delete('/tmp/telnetDebug.log') if File.exists?('/tmp/telnetDebug.log')
begin
EventMachine.run do
['device1', 'device2_will_fail', 'device3'].each do |h|
opts = {
host: h,
username: "user",
password: "pass",
binmode: true,
telnetmode: true,
login_prompt: /[$%#:>]\s\z/n,
password_prompt: /[$%#:>]\s\z/n,
prompt: /[$%#:>]\s?\z/n,
output_log: "/tmp/telnetDebug.log",
}
EM::P::SimpleTelnet.new(opts) do |host|
# already logged in
puts "Connected"
puts host.cmd('cmd1') { |c| puts c }
puts host.cmd('cmd2') { |c| puts c }
puts host.cmd("exit") { |c| puts c }
end
end
end
rescue Exception => e
puts e.inspect
end
me@WorkStation:~/ruby_workspace/modem_updates$ ruby modem_update_em.rb
#<EventMachine::Protocols::SimpleTelnet::LoginFailed: Timed out while expecting some kind of prompt.>
我愿意接触那些在这方面有经验的人,并为我的问题提供一些可能的解决方案。有人可以提出如何从错误中恢复的建议(如下所示)?或许还有另一种方法?非常感谢您的专业知识。