这不应该那么复杂,但似乎Ruby和Python Telnet库都有笨拙的API。谁能告诉我如何将命令写入Telnet主机,然后将响应读入字符串进行某些处理?
在我的情况下" SEND"使用换行符检索设备上的某些温度数据。
使用Python我试过:
tn.write(b"SEND" + b"\r")
str = tn.read_eager()
不返回任何内容。
在Ruby中我尝试过:
tn.puts("SEND")
也应该返回一些东西,我唯一能做的就是:
tn.cmd("SEND") { |c| print c }
您无法对c
做多少工作。
我在这里遗漏了什么吗?我期待像Ruby中的Socket库这样的代码,例如:
s = TCPSocket.new 'localhost', 2000
while line = s.gets # Read lines from socket
puts line # and print them
end
答案 0 :(得分:0)
我发现如果你没有为cmd
方法提供一个块,它会给你回复响应(假设telnet没有要求你做任何其他事情)。你可以一次发送所有命令(但是将所有响应捆绑在一起)或者进行多次调用,但你必须进行嵌套块回调(否则我无法做到)。
require 'net/telnet'
class Client
# Fetch weather forecast for NYC.
#
# @return [String]
def response
fetch_all_in_one_response
# fetch_multiple_responses
ensure
disconnect
end
private
# Do all the commands at once and return everything on one go.
#
# @return [String]
def fetch_all_in_one_response
client.cmd("\nNYC\nX\n")
end
# Do multiple calls to retrieve the final forecast.
#
# @return [String]
def fetch_multiple_responses
client.cmd("\r") do
client.cmd("NYC\r") do
client.cmd("X\r") do |forecast|
return forecast
end
end
end
end
# Connect to remote server.
#
# @return [Net::Telnet]
def client
@client ||= Net::Telnet.new(
'Host' => 'rainmaker.wunderground.com',
'Timeout' => false,
'Output_log' => File.open('output.log', 'w')
)
end
# Close connection to the remote server.
def disconnect
client.close
end
end
forecast = Client.new.response
puts forecast