我需要使用Ruby和Telnet登录服务器并执行一些命令。我的实际剧本是:
tn = Net::Telnet::new("Host" => "#{ip}", "Port" => 23, "Timeout" => 60,
"Output_log"=>"output_log.log",
"Dump_log"=> "dump_log.log",
"Prompt" => /[#]/ )
tn.cmd("#{USER}\n#{PASS}") { |c| print c }
puts tn.cmd("Conf")
tn.waitfor(/config/) { |str| puts str }
puts tn.cmd("Int fa23")
puts tn.cmd("Shut")
puts tn.cmd("No shut")
puts tn.cmd("Exit")
tn.close
我必须在输出中找到字符串“config”后才执行第二个命令(Int fa23
)。问题是waitfor无法正常工作。这是output_log:
Trying XX.XX.XX.XX...
Connected to XX.XX.XX.XX.
User Name:username
Password:*************
BOT-SWT-VSAT-AL-...#Conf
BOT-SWT-VSAT-AL-...(config)#
脚本因waitfor超时错误而停止。我做错了什么?
答案 0 :(得分:0)
请在Net :: Telnet :: new之后添加等待符
您应该等待建立连接(在创建Telnet实例时发生),然后等待服务器每次响应,然后再发送下一条命令。
localhost = Net::Telnet::new("Host" => "*****",
"Port" => ***,
"Timeout" => 10,
"Prompt" => /[$%#>] \z/n)
localhost.waitfor(/USER/) {
localhost.cmd("****") {
localhost.waitfor(/PASS/) {
|c| print c
# your next commands
...
# localhost.close
}
}
}
此处的关键是确保在回复之前,已从服务器收到所有数据包(直到收到EOF)。有时,甚至消耗/等待空格字符也可能算在内(取决于telnet服务器的设计方式)。 然后,请确保为您的匹配设置正确的正则表达式。