2014-01-25 4 views
0

Мне нужно подключиться к удаленному серверу через telnet. Чтобы пройти аутентификацию на сервере, я должен ответить, как 100 вопросов. Поэтому я попытался автоматизировать эту задачу в python с помощью telnetlib, но приглашение останавливается, не возвращая никакого сообщения.подключиться к telnet в python с помощью викторины в качестве логина?

вот что я сделал

import telnetlib 

port = 2002 
host = "23.23.190.204" 

tn = telnetlib.Telnet(host, port) 
tn.read_until(""" 
Welcome to EULER! 
       ================= 
            Answer 100 simple questions to authenticate yourself 
""") 
print tn.read_all() 
tn.close() 

в командной строке я получаю это сообщение

Welcome to EULER! 
================= 
Answer 100 simple questions to authenticate yourself 

тогда я получаю задал вопрос, если ответ правильный, я получаю следующий вопрос до Я закончил 100. Но в программе python я не получаю ни сообщения, ни вопросов! что делать?

EDIT:

после установки уровня отладки для телнета, я получаю ответ сервера. Не могли бы вы объяснить, почему?

tn.set_debuglevel(9) 

ответ

2

Это поддельный сервер телнет с помощью Netcat (ncat из Nmap):

$ ncat -l 9000 <msg.txt> log.txt 

листинг на порт 9000 и передает файл с именем msg.txt (вопросы) и войти вход в log.txt (ответы), он должен имитировать ваш сервер.

Файл msg.txt содержание:

Welcome to EULER! 
================= 
Answer 100 simple questions to authenticate yourself 
What is your name? 
How old are you? 
Do you use Python? 

содержимое файла в шестнадцатеричном (с использованием hexdump msg.txt):

00000000: 0A 57 65 6C 63 6F 6D 65 20 74 6F 20 45 55 4C 45 | Welcome to EULE| 
00000010: 52 21 0A 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D |R! =============| 
00000020: 3D 3D 3D 3D 0A 41 6E 73 77 65 72 20 31 30 30 20 |==== Answer 100 | 
00000030: 73 69 6D 70 6C 65 20 71 75 65 73 74 69 6F 6E 73 |simple questions| 
00000040: 20 74 6F 20 61 75 74 68 65 6E 74 69 63 61 74 65 | to authenticate| 
00000050: 20 79 6F 75 72 73 65 6C 66 0A 57 68 61 74 20 69 | yourself What i| 
00000060: 73 20 79 6F 75 72 20 6E 61 6D 65 3F 0A 48 6F 77 |s your name? How| 
00000070: 20 6F 6C 64 20 61 72 65 20 79 6F 75 3F 0A 44 6F | old are you? Do| 
00000080: 20 79 6F 75 20 75 73 65 20 50 79 74 68 6F 6E 3F | you use Python?| 
00000090: 0A            |    | 
00000091;             |    | 

уведомление символ новой строки, это \x0A или \n (он также может быть \x0D\x0A или \n\r).

Клиент:

import telnetlib 

port = 9000 
host = "127.0.0.1" 

tn = telnetlib.Telnet(host, port) 
r = tn.read_until("""\nWelcome to EULER! 
================= 
Answer 100 simple questions to authenticate yourself\n""") 

tn.read_until("What is your name?\n") 
tn.write("foo\n") # The client sends `\n`, notice the server may expects `\n\r`. 
print("Question 1 answered.") 

tn.read_until("How old are you?\n") 
tn.write("100\n") 
print("Question 2 answered.") 

tn.read_until("Do you use Python?\n") 
tn.write("yep\n") 
print("Question 3 answered.") 

tn.close() 

теперь позволяет проверить это, на стороне клиента:

$ python client.py 
Question 1 answered. 
Question 2 answered. 
Question 3 answered. 
$ 

на стороне сервера, сбросить содержимое файла журнала:

$ ncat -l 9000 <msg.txt> log.txt 
$ 
$ cat log.txt # or `type log.txt` on windows 
foo 
100 
yep 

$ 
$ hexdump log.txt 
00000000: 66 6F 6F 0A 31 30 30 0A 79 65 70 0A    |foo 100 yep | 
0000000c; 
$ 

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