Telnet发送命令然后读取响应

时间:2015-06-09 21:02:32

标签: python ruby telnet telnetlib

这不应该那么复杂,但似乎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

1 个答案:

答案 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