2015-06-09 3 views
0

Это не должно быть так сложно, но кажется, что и библиотеки Ruby и Python Telnet имеют неудобные API. Может ли кто-нибудь показать мне, как написать команду на хост Telnet, а затем прочитать ответ в строку для некоторой обработки?Telnet отправить команду, а затем прочитать ответ

В моем случае «ОТПРАВИТЬ» с помощью новой строки извлекает некоторые данные о температуре на устройстве.

С Python Я пробовал:

tn.write(b"SEND" + b"\r") 
str = tn.read_eager() 

, который ничего не возвращает.

В Ruby я пробовал:

tn.puts("SEND") 

, который должен вернуть что-то, как хорошо, единственное, что я получил на работе есть:

tn.cmd("SEND") { |c| print c } 

, которые вы не можете сделать с c ,

Я что-то упустил? Я ожидал что-то вроде библиотеки сокета в Ruby, с каким-то кодом, как:

s = TCPSocket.new 'localhost', 2000 

while line = s.gets # Read lines from socket 
    puts line   # and print them 
end 
+1

Хотя вы можете сделать очень элементарное рукопожатие через Telnet, вам действительно нужно использовать «ожидать» -like библиотеки, чтобы предоставить вам возможность реагировать на неожиданные ответы и/или длительные задержки и перерывы. См. Http://stackoverflow.com/q/7142978/128421 для рекомендаций Ruby «ожидать». –

+0

Итак, я посмотрел на некоторые из ожидающих библиотек для python и ruby, и похоже, что они имеют аналогичные настройки, такие как telnet libs. pexpect.expect() совпадает с telnetlib.wait_until(), насколько мое приложение идет? – bischoffingston

+0

Другое дело, что я не хочу ожидать ответа, я хочу загрузить ответ в переменную. Метод ожидания в этих библиотеках только возвращает индекс, если совпадение найдено. – bischoffingston

ответ

0

Я обнаружил, что если вы не предоставите блок методы cmd, это даст Вам ответ (предполагая, что в телнете не просит вас ни о чем другом). Вы можете отправлять команды сразу (но получить все ответы в комплекте) или выполнять множественные вызовы, но вам нужно будет выполнять вложенные обратные вызовы блоков (я не смог сделать это в противном случае).

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 
Смежные вопросы