2016-07-10 5 views
2

снабжать струной, тетивой и т.п. [Python telnetlib read_until проблемы ПРИЕМ]

функция

"read_until" возвращает отрезать строку с длинными командами.
Команды выполнялись отлично, но не отображались полные тексты.
Как я могу это исправить? Пожалуйста помоги.Python telnetlib read_until возвращается отрезать

# мой код

tn = telnetlib.Telnet(ip, 23, 5) 
prompt = ']# ' 
tn.write('echo "this is a long command for the test purpose... > test.txt"\n') 
print tn.read_until(prompt, 1) 

# отлаживать выход

Telnet (192.168.220.4,23): отправить «эхо«это длинная команда для целей тестирования ... > test.txt "\ n '
Telnet (192.168.220.4,23): recv' echo" это al '
Telnet (192.168.220.4,23): команда recv' ong для цели тестирования ...> te \ r \ x00 < его is '
Telnet (192.168.220.4,23): recv 'длинная команда для цели тестирования ...> tes'
Telnet (192.168.220.4,23): recv '\ x08 \ x08 \ x08 \ x08 \ x08 \ x08 \ x08 \ x08 \ x08 \ x08 \ x08 \ x08 \ x08 \ x08 \ x08 \ x08 \ x08 \ x08 \ x08 \ x08 \ x08 \ x0 8t.txt "'
Telnet (192.168) .220.4,23): recv '\ r \ nthis - длинная команда для цели тестирования ...>'
Telnet (192.168.220.4,23): recv 'test.txt \ r \ n [root @ RHEL6- 5 TMP] # '

# реальный выход

< его длинный Команда для целей тестирования ...> test.txt»
это длинная команда для целей тестирования ...> test.txt
[корень @ RHEL6-5 TMP] #

+0

Проводы тот же вопрос. Похож на проблему переноса строки, но не может понять, как отключить ее. – monkut

ответ

1

Проблема, как представляется, происходят из-за обертывания строк. Я нашел решение, в котором установка ширины окна почти до максимального значения позволяет получать длинные строки без обертки строк, применяемой сервером telnet.

(См Размер окна Option RFC для получения подробной информации о настройке параметра https://www.ietf.org/rfc/rfc1073.txt)

import telnetlib 
import struct 
from telnetlib import DO, DONT, IAC, WILL, WONT, NAWS, SB, SE 

MAX_WINDOW_WIDTH = 65000 # Max Value: 65535 
MAX_WINDOW_HEIGHT = 5000 


def set_max_window_size(tsocket, command, option): 
    """ 
    Set Window size to resolve line width issue 
    Set Windows size command: IAC SB NAWS <16-bit value> <16-bit value> IAC SE 
    --> inform the Telnet server of the window width and height. 
    Refer to https://www.ietf.org/rfc/rfc1073.txt 
    :param tsocket: telnet socket object 
    :param command: telnet Command 
    :param option: telnet option 
    :return: None 
    """ 
    if option == NAWS: 
     width = struct.pack('H', MAX_WINDOW_WIDTH) 
     height = struct.pack('H', MAX_WINDOW_HEIGHT) 
     tsocket.send(IAC + WILL + NAWS) 
     tsocket.send(IAC + SB + NAWS + width + height + IAC + SE) 
    # -- below code taken from telnetlib source 
    elif command in (DO, DONT): 
     tsocket.send(IAC + WONT + option) 
    elif command in (WILL, WONT): 
     tsocket.send(IAC + DONT + option) 

ip = 'x.x.x.x' 
tn = telnetlib.Telnet(ip, 23, timeout=5) 
tn.set_option_negotiation_callback(set_max_window_size) 

tn.write('echo "this is a long command for the test purpose... > test.txt"\n') 

prompt = ']# ' 
print tn.read_until(prompt, timeout=1) 
+0

Большое спасибо monkut. Ваше решение работает как шарм! Я потратил столько времени, чтобы решить эту проблему. Ты моя жизнь! ;) – curtis

+0

Нет проблем! Если это сработало для вас, продолжайте и отметьте его как принятый ответ. – monkut

+0

Это позволит решить вашу проблему случайно, и вы можете столкнуться с проблемой иногда, даже с этим «исправлением». Настоящая проблема заключается в непонимании функции 'read_until()'. 'read_until()' не блокируется, что означает, что он работает только с данными, которые уже вошли в хост, которые могут быть обрезаны в любой произвольной точке из-за того, как работает TCP. То, что вы действительно хотите использовать, - это функция 'expect()'. – blubberdiblub

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

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