Возникли проблемы с модулем telnetlib в Python - PullRequest
4 голосов
/ 22 декабря 2009

У меня есть базовый чат-сервер, к которому я могу легко подключиться через telnet. Я просто ввожу хост и порт и без какой-либо дополнительной аутентификации могу начать вводить команды, которые сервер может интерпретировать. Чтобы имитировать пользовательский трафик, я хотел бы создать скрипт, который будет открывать telnet, подключаться к серверу и немедленно начинать отправлять команды на сервер. Сначала я пытался сделать это с помощью пакетных сценариев, но после обнаружения слишком большого количества дорожных блоков я решил использовать модуль telnetlib Python. Вот как теперь выглядит скрипт

import telnetlib
myTel = telnetlib.Telnet('XXX.XXX.XXX.XXX', XXXX)
myTel.write('login')
myTel.write('move room')
myTel.write('say message')
myTel.write('exit')
myTel.write('logout')

Это действительно так просто, и скрипт работает без ошибок. Однако, если я уже вручную вошел в систему на другом сеансе telnet, я не вижу сценария, входящего в главную комнату или отправляющего сообщение чата, которое заставляет меня поверить, что что-то идет не так. Если я вручную запускаю два сеанса telnet, я могу легко отправлять и получать сообщения между сеансами, поэтому я думаю, что сеанс telnet вручную должен получать сообщения из сеанса, запущенного сценарием.

Есть идеи?

Ответы [ 3 ]

3 голосов
/ 22 декабря 2009

Возможно, добавление новой строки поможет?

myTel.write('login\n')

Я бы также порекомендовал использовать какой-либо сетевой инструмент для перехвата (например, Wireshark), чтобы убедиться, что вы действительно отправляете то, что хотели.

0 голосов
/ 22 декабря 2009

Я бы использовал read_until, чтобы проверить, что сервер готов к приему команды. Вот пример использования telnet для связи с коммутатором Cisco:

from telnetlib import Telnet
PASSWD = "mypass"

t = Telnet(switch)
t.read_until("Password: ", 2)
t.write(PASSWD + "\r\n")

Здесь я жду запроса пароля перед отправкой пароля.

0 голосов
/ 22 декабря 2009

В своем коде вы пишете на сервер, но для получения данных вам в конечном итоге потребуется один из методов чтения библиотеки. Чтобы увидеть пример реализации клиента с «веткой чтения», см. Этот пост в блоге: http://hahong.org/blog/posts/261.

п. Также попробуйте:

myTel.write('login\n')

.. с символами новой строки.

...