2016-04-24 4 views
0

Ich bin ein Python-Skript zu schreiben 10001. Grundsätzlich einige Daten von einem Remote-Telnet-Server Port zu analysieren, wenn ich schreibe:telnetlib read_until() paßt nicht alles

$ telnet <host> 10001 

Der Terminal druckt:

Trying <host>... 
Connected to static-<host>.nycmny.fios.verizon.net. 
Escape character is '^]'. 
# empty line for prompt 

auf die leere Zeile in dem Kommentar, der ist, wo ich Befehle wie die folgenden ('\n' steht für das schlagen zurück) geben sollte:

^Ai20101\n 
# server prints out data 
somedatalinehere 
^] 
# escape to telnet prompt like below 
telnet> 
telnet> quit\n 
connection closed. 
# returns to local terminal prompt 

Allerdings, wenn ich die in Python:

tn = telnetlib.Telnet(host, 10001) 
tn.read_until("\r\n", timeout=1)  # nothing matched, returns '' 
tn.read_until("", timeout=1)   # nothing matched, returns '' 
# thus 
tn.write("^Ai20101\n") 
time.sleep(0.1)      # wait 0.1s for next prompt 
tn.write("^]") 
time.sleep(0.1) 
tn.write("quit\n") 
tn.read_all()      # This hangs as if connection wasn't closed. 

Antwort

0

Ich habe es mit einem Kind-Prozess von pexpect arbeiten, die viel flexibler als Telnetlib ist.

import pexpect 
import time 

child = pexpect.spawn('telnet <host> 10001') 
child.sendcontrol('a') 
child.send('i20101' + '\n') 

Ohne Notwendigkeit read_until(), dies funktionierte.

1

, dass alle Ausgaben vor der eigentlichen Eingabeaufforderung (die $ Zeichen oder so ähnlich) von Ihrem eigenen Telnet-Client, nicht vom Server generiert wird .

versuchen So etwas wie folgt aus:

tn.read_until("$") 

Wenn dies gelingt, bedeutet dies, Sie auf OK verbunden und Befehle erteilen kann.


read_all()sollte 'hängen'. Zitat aus dem docs:

Telnet.read_all()

Alle Daten bis EOF; Block bis Verbindung geschlossen.


Edit:

Eigentlich posted Sie no Server-Antwort. Das ganze Zeug wird, wie ich schon sagte, vom Kunden generiert.

Was bedeutet # the prompt starts here? Ich denke, es bedeutet, dass nach all dem Ausgang Sie eine Eingabeaufforderung angezeigt ist, die so ähnlich aussieht:

ForceBru @ iMac-ForceBru:~ $ 

Also, Sie bis zu diesem Zeile sollten, um sicherzustellen, dass die Verbindung erfolgreich war.

+0

Danke, aber ich habe immer noch eine leere Saite. Allerdings verstehe ich deine Erklärung nicht wirklich. Kannst du es ausarbeiten? Ich weiß '$' ist die Eingabeaufforderung von meinem Client, aber warum sollte ich es dann mit 'read_until (" $ ")' 'lesen? – PieOhPah

+0

@PieOhPah, wenn Sie erfolgreich eine Verbindung zum Server mit nur 'Telnet' herstellen (noch kein Python), erhalten Sie diese Eingabeaufforderung _vom Server_ zurück. Kopieren Sie es und fügen Sie anstelle des Dollarzeichens in meinem Beispiel ein. – ForceBru

+0

Können Sie Ihre Antwort bearbeiten, um zu klären, was Sie in Bezug auf die Antwort von dem Server, den ich gepostet habe, sagen möchten? Es ist genau das, worauf der Server antwortet, und nirgends gibt es eine Aufforderung wie '$'. – PieOhPah

Verwandte Themen