Gewusst wie: drucken/anzeigen der Ausgabe der telnet-session im terminal-Fenster (Python)
Kann mir jemand helfen zu verstehen, wie Druck in das terminal-Fenster funktioniert?
Hier ist ein test-Skript
test_script.py
import telnetlib
HOST = "10.1.1.151"
tn = telnetlib.Telnet(HOST)
tn.open(HOST)
test_var = ["test"]
print test_var
tn_read = tn.read_very_eager()
print tn_read
Ausgabe, wenn das Skript ausgeführt wird, vom terminal:
$ python test_script.py
['test']
tn_read
sollte so etwas wie "Benutzername :" aber es wird nicht gedruckt, die in das terminal-Fenster.
Wenn ich ihn aus dem interpreter habe ich das bekommen, was erwartet wird:
>>> tn.read_very_eager()
'\n\rUser Name : '
Warum oder was muss getan werden, um die folgende Ausgabe beim Aufruf des Skripts aus dem terminal ?
$ python test_script.py
['test']
User Name :
- die Existenz von "\r", der Wert macht mich Frage mich, ob es lohnt sich mit .lstrip() auf die tn_read variable : d.h. druckt tn_read.lstrip() die Dinge besser zu machen.
- Nein, es macht keinen Unterschied.
- Vielleicht schauen Sie in der Dokumentation, wenn es andere Funktionen, wie vielleicht einige
tn.read_not_so_eager()
(nur ein Beispiel) oder so etwas wietn.read()
. - Ich habe versucht, verschiedene Funktionen (
tn.read_unitl(), read_eager()
) aber keiner zu sehen, der die Werte, wenn ich das Skript aus dem terminal. - drucken sollte funktionieren terminal. versuchen Sie so etwas wie print type(tn_read), tn_read, um herauszufinden, wenn das Modul das erwartete Ergebnis zurückgibt. wenn es gibt ein Objekt zurück, enstead Schnur, vielleicht haben Sie es ändern müssen, um die string-Repräsentation erste.
>>> tn.open(HOST) >>> tn_read = tn.read_very_eager() >>> type(tn_read), tn_read (<type 'str'>, '\n\rUser Name : ')
>>>- Das geänderte Skript:
test_var = ["test"] print test_var tn_read = tn.read_very_eager() print type(tn_read), tn_read
Ausgabe auf dem terminal: `$ python test_script.py ['test'] <type 'str'> . "User Name :" wird nicht gedruckt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die kurze Antwort ist die Verwendung
read_until()
mit einem timeout. z.B.Die lange Antwort folgt.
read_very_eager()
ist non-blocking und es wird wieder gekocht-Daten bereits zur Verfügung, doch nichts wenn es keine Daten. Wenn Sie anrufen, eine non-blocking "read" - Methode auch bald nach dem Aufbau der Verbindung, kann es keine Daten zu Lesen und zuread_very_eager()
wird eine leere Zeichenfolge zurückgeben -''
.Also dein problem ist wahrscheinlich timing-Zusammenhang; das Lesen nicht blockiert und kann keine Daten zurückgeben, die noch nicht empfangen wurde, verarbeitet und zwischengespeichert. Wenn Sie interagieren, über das terminal, dauert es Zeit für Sie, geben Sie die Befehle, so dass Sie nicht bemerken das Problem mit dem timing, aber bei der Ausführung von einem script das menschliche Verzögerung wird entfernt, und die timing-Problem deutlich wird. Versuchen Sie, schlafen Sie vor dem Aufruf der read-Methode:
Führen Sie die oben, wie ein Skript, und Sie könnte das erwartete Ausgabe.... dann wieder, vielleicht auch nicht. Stattdessen könnten Sie noch sehen:
Kann es auch die anderen Faktoren, insbesondere der server antwortet mit einem Telnet-IAC-Sequenz.
telnetlib
verbraucht diese Sequenz, wenn es angekommen ist, rufen Sie vorread_very_eager()
(lese-Funktion eigentlich). In diesem Fallread_very_eager()
auch einen leeren string zurück.Wenn Sie möchten, um zu sehen, was ausgetauscht wird, die über die Verbindung, die Sie anrufen können
set_debuglevel(1)
:import telnetlib
Typische Ausgabe ist:
Des anderen "Lesen" - Funktionen, sollten Sie wahrscheinlich verwenden
read_until()
. Wenn Sie nicht wollen, zu blockieren, pass ein timeout, um es, wie oben gezeigt.read_very_eager
! du hast mich gerettet!Beispiel einer telnet-Sitzung auf einem terminal ein Netzwerk-Getriebe: