"#{ip}", "Port" => 23, "T-6ren">
gpt4 book ai didi

ruby 和远程登录 : waitfor doesnt work

转载 作者:太空宇宙 更新时间:2023-11-03 16:52:52 24 4
gpt4 key购买 nike

我需要使用 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 不工作。这是输出日志:

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)#

脚本因等待超时错误而停止。我做错了什么?

最佳答案

请在 Net::Telnet::new 之后添加 waitfor

您应该等待连接建立(这在创建 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 服务器的设计方式)。然后,确保为您的匹配项设置正确的正则表达式。

关于 ruby 和远程登录 : waitfor doesnt work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17046915/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com