2016-04-24 4 views
0

Я пишу сценарий Python для разбора некоторых данных с удаленного сервера телнет на порт 10001. В основном, когда я типа:telnetlib read_until() не соответствует Ничего

$ telnet <host> 10001 

терминал распечатывает:

Trying <host>... 
Connected to static-<host>.nycmny.fios.verizon.net. 
Escape character is '^]'. 
# empty line for prompt 

на пустой строке комментария, что то, где я должен ввести такие команды, как следующие ('\n' стендов для удара Обратно):

^Ai20101\n 
# server prints out data 
somedatalinehere 
^] 
# escape to telnet prompt like below 
telnet> 
telnet> quit\n 
connection closed. 
# returns to local terminal prompt 

Однако, когда я делаю это в Python:

tn = telnetlib.Telnet(host, 10001) 
tn.read_until("\r\n", timeout=1)  # nothing matched, returns '' 
tn.read_until("", timeout=1)   # nothing matched, returns '' 
# thus 
tn.write("^Ai20101\n") 
time.sleep(0.1)      # wait 0.1s for next prompt 
tn.write("^]") 
time.sleep(0.1) 
tn.write("quit\n") 
tn.read_all()      # This hangs as if connection wasn't closed. 

ответ

0

Я получил его для работы с использованием дочернего процесса от pexpect, который намного более гибкий, чем telnetlib.

import pexpect 
import time 

child = pexpect.spawn('telnet <host> 10001') 
child.sendcontrol('a') 
child.send('i20101' + '\n') 

без необходимости read_until(), это просто работал.

1

Все, что выход перед фактической командной строкой ($ знака или что-то в этом роде) генерируется вашего собственным телнет клиент, а не на сервере ,

Так попробовать что-то вроде следующего:

tn.read_until("$") 

Если это удастся, это означает, что вы подключены OK и может выдавать команды.


read_all()должен 'повесить'. Цитата из docs:

Telnet.read_all()

Читать все данные до конца файла; блок до закрытого соединения.


Edit:

На самом деле, вы вывесили ответ Нет сервера. Все это, как я уже говорил, генерируется клиентом.

Что означает # the prompt starts here? Я думаю, что это означает, что все-таки выход вы показали командную строку, которая выглядит примерно так:

ForceBru @ iMac-ForceBru:~ $ 

Таким образом, вы должны прочитать до этой самой линии, чтобы убедиться, что соединение успешно.

+0

Спасибо, но я все равно получил пустую строку точно так же. Однако я не понимаю вашего объяснения. Можете ли вы уточнить? Я знаю, что '' 'это приглашение от моего клиента, но тогда почему я должен читать его с помощью' read_until ("$") '? – PieOhPah

+0

@PieOhPah, когда вы успешно подключаетесь к серверу, используя только «telnet» (еще не Python), вы возвращаете это приглашение _ от сервера_. Скопируйте его и вставьте вместо знака доллара в моем примере. – ForceBru

+0

Можете ли вы отредактировать свой ответ, чтобы уточнить, что вы пытаетесь сказать относительно ответа от сервера, который я разместил? Это именно то, что отвечает сервер, и нет никакой подсказки, как '' 'где угодно. – PieOhPah

 Смежные вопросы

  • Нет связанных вопросов^_^