EOL for sys.stdin.readline() and raw_input()

Jean-Paul Calderone exarkun at divmod.com
Thu Feb 26 17:50:38 EST 2009


On Thu, 26 Feb 2009 23:32:13 +0100, jkv <jkv at unixcluster.dk> wrote:
>Jean-Paul Calderone wrote:
>>    sys.stdout.write('Password: ');
>>>    #IAC DO ECHO     sys.stdout.write('\xFF\xFB\x01')
>>>    password = raw_input()
>>>
>>>If the client sends 'qwerty\r\n' everything is fine and the password get 
>>>stored in the variable. But sometimes, depending on how broken the telnet 
>>>client are, the client will send 'qwerty\r\000' instead and then my 
>>>application will hang at 'password = raw_input()' forever.
>>>
>>>Any suggestions?
>>
>>It sounds like you might want to use a real implementation of the telnet
>>protocol in your application.  Such an implementation would deal with the
>>fact that telnet encodes \r as \r\0 for you.
>>
>>Twisted includes a telnet implementation, as well as facilities for reading
>>stdin asynchronously (which will let you avoid indefinite hangs).
>I running this script inside a wrapper (honeyd), so i cant really use 
>twisted since i dont have raw network access - i only got stdout, stdin and 
>stderr to play with.
>
>But i found a solution, posting it here for the archives:
>
>password = ""
>while 1:
>    c = sys.stdin.read(1)
>    if c == '\r' or c == '\n':
>        break
>    password = password + c
>

Glad you figured something out.  Just for the record, you can use Twisted
to write applications that interact with stdio, so the fact that you're
using honeyd doesn't prevent you from using Twisted.

Jean-Paul



More information about the Python-list mailing list