Bug in telnetlib?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Experimentiere gerade mit [mod]telnetlib[/mod] unter Windows. Ich verbinde mich auch mit dem Windowsrechner (localhost)...

Wenn ich debug mit tn.set_debuglevel(999) einschalte, kann ich sehen, das Daten die gesendet werden nur mit "\n" abgeschlossen sind. Das scheint aber mit Windows nicht zu funktionieren, weil "\n\r" erwartet wird!

Kann jeder unter Windows ja mal selber Testen mit dem hier:

Code: Alles auswählen

import sys
import telnetlib

HOST = "localhost"

print "connect '%s'..." % HOST,
tn = telnetlib.Telnet(HOST)
print "OK"

tn.set_debuglevel(1)

tn.mt_interact()
Man muß den "telnet" Dienst anhaben und den User in die Gruppe "TelnetClients" packen.

Es sieht so aus:
connect 'localhost'... OK
...
Telnet(localhost,23): recv 'Welcome to Microsoft Telnet Service \r\n'
Welcome to Microsoft Telnet Service
Telnet(localhost,23): recv '\n\rlogin: '


login: jens
Telnet(localhost,23): send 'jens\n'
Telnet(localhost,23): recv 'jens'
jens
Es wird also nur mit "\n" gesendet und man kommt nicht weiter...

Mit "\n\r" geht's aber, siehe:

Code: Alles auswählen

import sys
import telnetlib

HOST = "localhost"

print "connect '%s'..." % HOST,
tn = telnetlib.Telnet(HOST)
print "OK"

tn.set_debuglevel(1)

tn.read_until('login: ')
tn.write("jens\r\n")

tn.mt_interact()
Ausgabe:
connect 'localhost'... OK
...
Telnet(localhost,23): recv 'Welcome to Microsoft Telnet Service \r\n'
Telnet(localhost,23): recv '\n\rlogin: '
Telnet(localhost,23): send 'jens\n\r'
Telnet(localhost,23): recv 'jens\n\rpassword: '
jens

password:
Nun wurde der Username akzeptiert und man kommt zur Passwort abfrage...

hab in den Quellen von telnetlib.py gesucht, aber nichts gefunden, wie man das Problem ändern könnte.

(Getestet mit Python 2.5.2 unter Vista.)

Lustig ist, das es egal ist ob "\n\r" oder "\r\n" gesendet wurde ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Fabian Kochem
User
Beiträge: 36
Registriert: Mittwoch 5. April 2006, 14:11
Wohnort: Köln

Und wo liegt das Problem, \r ebenfalls noch mitzusenden?
Kannst ja eine Wrapper-Methode bauen, die das automatisch für dich erledigt (vllt noch überprüft, ob der zu sendene String bereits mit \n oder \r endet).
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Das Problem ist, das man so ohne weiteres nicht einfach nur tn.mt_interact() nutzten kann. Ein Wrapper bauen könnte man zwar tun, aber ist doch nur ein work-a-round. IMHO sollte es einfach so funktionieren...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Das scheint aber nichts mit der telnetlib zu tun zu haben. Ich habe dasselbe Phänomen auch bei 2 über die serielle Schnittstelle verbundenen Rechnern beobachtet. Eingaben vom Windows- an den Linuxrechner wurden nur akzeptiert, wenn diese mit '\r\n' abgeschlossen wurden.
MfG
HWK
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Hast du vielleicht mal die Telnet-RFC gelesen? Ich glaube auch, dass man sich hier nach den Delimitern richten sollte, die das Protokoll vorschreibt und nicht nach denen, die das Betriebssystem in Dateien verwendet. HTTP klappt auch nicht nur mit einem Newline.
BlackJack

Ein wirklich ganz kurzer Blick in RFC854 lässt mich vermuten, dass das Telnet-Protokoll einfach CR LF oder LF CR erwartet bzw. vorschreibt.

edit: Ups da war ich wohl auch mit dem ganz kurzen Blick zu langsam. :-)
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Keine Sorge, kurz reingeblickt hab' ich da auch ;)
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Naja, egal was die RFC854 nun vorschreibt, fakt ist, das es bei mir ertmal nur dann funktioniert, wenn \r\n oder \n\r gesendet wird und nicht nur ein \n...

Somit sollte entweder os.linesep genommen werden, oder zumindest die Möglichkeit die zeilenenden einfach zu ändern. z.B.:

Code: Alles auswählen

tn = telnetlib.Telnet(HOST, linesep=os.linesep)
oder so...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Äh nee, es ist *nicht* egal, was die RFC vorschreibt - dafür ist ein Standard ja da. Und wenn der das festlegt, dann braucht man eine Library auch nicht konfigurierbar machen.

Und wie kommst du überhaupt auf die Idee, einen "file separator" mit einem Telnet-Kommando-Delimiter gleichsetzen zu wollen? Und wieso sollte der überhaupt uneinheitlich sein? Wie soll man gegen so eine (fehlende) Konvention denn etwas implementieren?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Verwechselst du os.linesep mit os.sep?
http://docs.python.org/dev/library/os.html#os.linesep
http://docs.python.org/dev/library/os.html#os.sep

In einer guten, schönen Welt sollte man sich auf RFC und Co. verlassen können. In der bösen M$ Welt aber nicht. Gefällt mir auch nicht, aber so ist es halt.

Die Aufforderung "dann nimm doch ein gescheites Betriebsystem" hilft da auch nicht weiter...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

jens hat geschrieben:In einer guten, schönen Welt sollte man sich auf RFC und Co. verlassen können. In der bösen M$ Welt aber nicht. Gefällt mir auch nicht, aber so ist es halt.

Die Aufforderung "dann nimm doch ein gescheites Betriebsystem" hilft da auch nicht weiter...
Es hilft insefern weiter, dass man kaputte Implementationen vermeidet. Die richtige Lösung wäre entweder ein anderes OS zu verwenden, einen anderen Telnet-Server oder gleich SSH. ``telnetlib`` empfinde ich als überflüssig, ist ähnlich nüzlich wie eine ``gopherlib``, selbst wenn Windows einen Gopher-Server mitliefern würde.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

jens hat geschrieben:Verwechselst du os.linesep mit os.sep?
Tatsache. Ich sehe allerdings nicht ein, wieso sich ein plattformübergreifendes/-unabhängiges Protokoll an den Eigenheiten einzelner Betriebssysteme orientieren sollte, solange sie ein bisschen mit ASCII hantieren können.
Antworten