/Demo/threads/telnet.py

http://unladen-swallow.googlecode.com/ · Python · 114 lines · 80 code · 9 blank · 25 comment · 28 complexity · 2e180875519db1e8dcfbcfbc041f90fb MD5 · raw file

  1. # Minimal interface to the Internet telnet protocol.
  2. #
  3. # *** modified to use threads ***
  4. #
  5. # It refuses all telnet options and does not recognize any of the other
  6. # telnet commands, but can still be used to connect in line-by-line mode.
  7. # It's also useful to play with a number of other services,
  8. # like time, finger, smtp and even ftp.
  9. #
  10. # Usage: telnet host [port]
  11. #
  12. # The port may be a service name or a decimal port number;
  13. # it defaults to 'telnet'.
  14. import sys, os, time
  15. from socket import *
  16. import thread
  17. BUFSIZE = 8*1024
  18. # Telnet protocol characters
  19. IAC = chr(255) # Interpret as command
  20. DONT = chr(254)
  21. DO = chr(253)
  22. WONT = chr(252)
  23. WILL = chr(251)
  24. def main():
  25. if len(sys.argv) < 2:
  26. sys.stderr.write('usage: telnet hostname [port]\n')
  27. sys.exit(2)
  28. host = sys.argv[1]
  29. try:
  30. hostaddr = gethostbyname(host)
  31. except error:
  32. sys.stderr.write(sys.argv[1] + ': bad host name\n')
  33. sys.exit(2)
  34. #
  35. if len(sys.argv) > 2:
  36. servname = sys.argv[2]
  37. else:
  38. servname = 'telnet'
  39. #
  40. if '0' <= servname[:1] <= '9':
  41. port = eval(servname)
  42. else:
  43. try:
  44. port = getservbyname(servname, 'tcp')
  45. except error:
  46. sys.stderr.write(servname + ': bad tcp service name\n')
  47. sys.exit(2)
  48. #
  49. s = socket(AF_INET, SOCK_STREAM)
  50. #
  51. try:
  52. s.connect((host, port))
  53. except error, msg:
  54. sys.stderr.write('connect failed: %r\n' % (msg,))
  55. sys.exit(1)
  56. #
  57. thread.start_new(child, (s,))
  58. parent(s)
  59. def parent(s):
  60. # read socket, write stdout
  61. iac = 0 # Interpret next char as command
  62. opt = '' # Interpret next char as option
  63. while 1:
  64. data, dummy = s.recvfrom(BUFSIZE)
  65. if not data:
  66. # EOF -- exit
  67. sys.stderr.write( '(Closed by remote host)\n')
  68. sys.exit(1)
  69. cleandata = ''
  70. for c in data:
  71. if opt:
  72. print ord(c)
  73. ## print '(replying: %r)' % (opt+c,)
  74. s.send(opt + c)
  75. opt = ''
  76. elif iac:
  77. iac = 0
  78. if c == IAC:
  79. cleandata = cleandata + c
  80. elif c in (DO, DONT):
  81. if c == DO: print '(DO)',
  82. else: print '(DONT)',
  83. opt = IAC + WONT
  84. elif c in (WILL, WONT):
  85. if c == WILL: print '(WILL)',
  86. else: print '(WONT)',
  87. opt = IAC + DONT
  88. else:
  89. print '(command)', ord(c)
  90. elif c == IAC:
  91. iac = 1
  92. print '(IAC)',
  93. else:
  94. cleandata = cleandata + c
  95. sys.stdout.write(cleandata)
  96. sys.stdout.flush()
  97. ## print 'Out:', repr(cleandata)
  98. def child(s):
  99. # read stdin, write socket
  100. while 1:
  101. line = sys.stdin.readline()
  102. ## print 'Got:', repr(line)
  103. if not line: break
  104. s.send(line)
  105. main()