2015-07-22 5 views
1

Этот вопрос, вероятно, прост, но до сих пор я не смог найти решение в любом месте. В принципе, следующий код должен подключаться к хосту, принимать команду и печатать все, что возвращается хостом.Telnet и кодирование в Python

import telnetlib 
import time 

HOST = input("IP Address: ") 
tn = telnetlib.Telnet(HOST, port = 23, timeout = 20) 
time.sleep(10) 
command = input("Enter command: ") 
command.encode('utf-8') 
tn.write(b"\n".join(command)) 
ret1 = tn.read_eager() 
print(ret1) 

print("Success!") 
tn.close() 

Однако, независимо от того, что я стараюсь я продолжаю получать ту же ошибку:

C:\Python34>call python34 telnet_test.py 
IP Address: 10.20.249.64 
Enter command: 001 rq version 
Traceback (most recent call last): 
    File "telnet_test.py", line 9, in <module> 
    tn.write(b"\n".join(command)) 
TypeError: sequence item 0: expected a bytes-like object, str found 

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

ответ

0

Я предполагаю, что вы используете Python 2, а не 3. Я не возился с какой-либо кодировкой, и это сработало. В принципе, мой код следующим образом:

HOST = input("IP Address: ") 
tn = telnetlib.Telnet(HOST, port = 23, timeout = 20) 
time.sleep(10) 
command = input("Enter command: ") 
tn.write(command + "\r\n") 
ret1 = tn.read_eager() 
print(ret1) 

укажу эти 3 вещи: 1. функция кодирования возвращает кодированную версию строки, она does't изменяет саму строку, так что если вы хотите для изменения командной переменной вы должны использовать command = command.encode("utf-8"). 2. Я использовал \r\n, так как это машина для Windows. 3. Кроме того, я не уверен, что это то, что вы хотели сделать, но ваш join вставлял \n между каждым символом в вашей командной строке.

EDIT 24.07.15 Поскольку вы используете Python 3, я загрузил Python 3 и дал ему еще один вариант. Вот код, который работал для меня:

HOST = input("IP Address: ") 
tn = telnetlib.Telnet(HOST, port = 23, timeout = 20) 
time.sleep(10) 
command = input("Enter command: ") + "\r\n" 
tn.write(command.encode('utf-8')) 
ret1 = tn.read_eager() 
print(ret1) 

Причина вы получили эту ошибку, потому что вы не получили возвращаемое значение encode «s обратно в переменную command, поэтому она осталась неизменной. Поэтому, когда вы позвонили write с command, он все равно получил строку, которую она не ожидала. 2 стороны примечания - вам нужно использовать "\r\n", а не только "\n", предполагая, что вы используете сервер telnet Windows, хотя "\n" в порядке с системами UNIX; Я не знаю настройки вашего telnet-сервера, но по умолчанию им требуется аутентификация, поэтому вам нужно будет ввести учетные данные перед вводом команды.

+0

ОП использует Python 3. – fenceop

+0

Я должен был указать, я использую Python 3. Ваш код дает мне ошибку «TypeError:» в «требует строки как левого операнда, а не байтов», вытекающей из строки "command = input (" Enter command: ")" – Onamar

+0

Похоже, сработало, спасибо. Теперь моя единственная проблема заключается в том, что он возвращает b '' вместо любого фактического текста, но я думаю, что могу понять, что это может быть что-то в конце сервера. – Onamar

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