2016-07-10 27 views
2

[Python telnetlib read_until recv Problem]

"read_until" Funktion zurückkehrt abgeschnitten Zeichenfolge mit langen Befehlen abgeschnitten werden.
Die Befehle liefen einwandfrei, aber es werden keine Volltexte angezeigt.
Wie kann ich das beheben? Bitte helfen Sie.Python telnetlib read_until kehrt Zeichenfolge

# mein Code

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) 

# Debug-Ausgabe

Telnet (192.168.220.4,23): Senden ‚echo„dies ein langer Befehl für den Test Zweck ist ... > test.txt "\ n"
Telnet (192.168.220.4,23): recv 'echo "dies ist al'
Telnet (192.168.220.4,23): recv 'ONG Befehl für den Test Zweck ...> te \ r \ x00 < sein ist '
Telnet (192.168.220.4,23): recv 'ein langer Befehl für den Testzweck ...> 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 \ x08 \ x08 \ x08 \ x0 8t.txt "‘
Telnet (192.168 .220.4,23): recv '\ r \ ndies ist ein langer Befehl für den Testzweck ...>'
Telnet (192.168.220.4,23): recv 'test.txt \ r \ n [root @ RHEL6- 5 tmp] # '

# reale Produktion

< sein ist eine lange Befehl für die Testzwecke ...> test.txt“
dies für die Testzwecke ein langer Befehl ist ...> test.txt
[root @ RHEL6-5 tmp] #

+0

das gleiche Problem sehen. Sieht aus wie ein Zeilenumbruchproblem, kann aber nicht herausfinden, wie das Problem behoben werden kann. – monkut

Antwort

1

Das Problem scheint wegen Zeilenumbruch auftreten. Ich habe eine Lösung gefunden, bei der das Einstellen der Breite der Fenstergröße nahe dem Maximalwert zulässt, dass lange Zeilen ohne Zeilenumbruch empfangen werden, die vom Telnet-Server angewendet werden.

(Siehe Window Size Option RFC Einzelheiten über die Option Einstellung 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

Vielen Dank Mönch. Ihre Lösung wirkt wie ein Zauber! Ich verbrachte so viel Zeit, um dieses Problem zu lösen. Du bist mein Lebensretter! ;) – curtis

+0

Kein Problem! Wenn dies für Sie funktioniert, gehen Sie vor und markieren Sie es als die akzeptierte Antwort. – monkut

+0

Das wird nur Ihr Problem zufällig lösen und Sie können das Problem gelegentlich gelegentlich auch mit dieser "Lösung" auftreten. Das eigentliche Problem ist ein Missverständnis der 'read_until()' Funktion. 'read_until()' blockiert nicht, was bedeutet, dass es nur auf den Daten operiert, die bereits in den Host eingegeben wurden, die aufgrund der Funktionsweise von TCP an jedem beliebigen Punkt abgeschnitten werden können. Was Sie wirklich verwenden möchten, ist die 'expect()' Funktion. – blubberdiblub