Как давать команды внутри сеанса telnet с помощью python

Я пишу скрипт Python для автоматизации некоторых задач в симуляторе... для подключения к симулятору команда telnet localhost <port>.

Эту команду я даю через os.system(telnet localhost <port>).

Это работает.

И симулятор работает:

Попытка ::1...
Соединение с локальным хостом.
Экранирующий символ '^]'.
>

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

#!/usr/bin/env python
import os,re,telnetlib
host = "localhost"
port = "1111"

tn = telnetlib.Telnet(host, port)
tn.write("exit")

Это пример кода, но он не работает.


person chitra    schedule 25.06.2019    source источник
comment
Кажется, вы упоминаете два разных способа открытия сеанса telnet: os.system('telnet localhost <port>') и tn = telnetlib.Telnet(host, port). Второй способ кажется мне более идиоматичным, но вы говорите, что он не работает? Можете ли вы объяснить, почему это не работает?   -  person Imperishable Night    schedule 25.06.2019
comment
после подключения к telnet мой симулятор запустится ... мы должны давать команды внутри этого › .... но не можем писать с помощью tn.write   -  person chitra    schedule 25.06.2019


Ответы (2)


Команда записи требует, чтобы содержимое было предоставлено в байтах. Попробуй это:

import os,re,telnetlib

host = "google.com"
port = "80"

telnet_client = telnetlib.Telnet(host, port)
print('Connection established')

telnet_client.write(b'exit')
print('<END/>')
person Frank CNatra    schedule 25.06.2019
comment
это используется для подключения к локальному хосту ... но я использую команду telnet localhost 2222 для запуска симулятора .... после этой команды. Экранирующий символ '^]'. › должно получиться вот так, но я не понимаю - person chitra; 25.06.2019
comment
Вы проверяли брандмауэр и антивирус? В зависимости от конфигурации они могут отклонять соединения. - person Frank CNatra; 26.06.2019

Возможно, вам потребуется указать telnetlib читать до приглашение, а затем напишите команду, которую вы хотите выполнить.

import os,re,telnetlib
host = "localhost"
port = "1111"

tn = telnetlib.Telnet(host, port)
tn.read_until(b">", timeout=10) # <- add this line
# tn.read_until(b"> ", timeout=10) # if prompt has space behind
tn.write(b"exit\n")

Вам также может быть полезен этот вопрос: Python Telnetlib read_until '#' или ' ›', определение нескольких строк?

person z11i    schedule 25.06.2019
comment
я добавил эту строку, но получаю сообщение об ошибке .......................telnet.read_until('›', timeout= 10) Файл /usr/lib64/python3.7/telnetlib.py, строка 302, в read_until i = self.cookedq.find(match) TypeError: аргумент должен быть целым или байтоподобным объектом, а не 'str' - person chitra; 25.06.2019
comment
@lokeswari вы используете Python 3, telnetlib ожидает байты или целые числа, что является ошибкой, которую вы получили. Я обновил свой ответ соответственно. - person z11i; 25.06.2019
comment
я не получаю никаких ошибок, используя это ... но мой симулятор не работает и не может дать команду выхода - person chitra; 25.06.2019