--- /dev/null
+#! /usr/bin/env python\r
+\r
+# Minimal interface to the Internet telnet protocol.\r
+#\r
+# It refuses all telnet options and does not recognize any of the other\r
+# telnet commands, but can still be used to connect in line-by-line mode.\r
+# It's also useful to play with a number of other services,\r
+# like time, finger, smtp and even ftp.\r
+#\r
+# Usage: telnet host [port]\r
+#\r
+# The port may be a service name or a decimal port number;\r
+# it defaults to 'telnet'.\r
+\r
+\r
+import sys, posix, time\r
+from socket import *\r
+\r
+BUFSIZE = 1024\r
+\r
+# Telnet protocol characters\r
+\r
+IAC = chr(255) # Interpret as command\r
+DONT = chr(254)\r
+DO = chr(253)\r
+WONT = chr(252)\r
+WILL = chr(251)\r
+\r
+def main():\r
+ host = sys.argv[1]\r
+ try:\r
+ hostaddr = gethostbyname(host)\r
+ except error:\r
+ sys.stderr.write(sys.argv[1] + ': bad host name\n')\r
+ sys.exit(2)\r
+ #\r
+ if len(sys.argv) > 2:\r
+ servname = sys.argv[2]\r
+ else:\r
+ servname = 'telnet'\r
+ #\r
+ if '0' <= servname[:1] <= '9':\r
+ port = eval(servname)\r
+ else:\r
+ try:\r
+ port = getservbyname(servname, 'tcp')\r
+ except error:\r
+ sys.stderr.write(servname + ': bad tcp service name\n')\r
+ sys.exit(2)\r
+ #\r
+ s = socket(AF_INET, SOCK_STREAM)\r
+ #\r
+ try:\r
+ s.connect((host, port))\r
+ except error, msg:\r
+ sys.stderr.write('connect failed: ' + repr(msg) + '\n')\r
+ sys.exit(1)\r
+ #\r
+ pid = posix.fork()\r
+ #\r
+ if pid == 0:\r
+ # child -- read stdin, write socket\r
+ while 1:\r
+ line = sys.stdin.readline()\r
+ s.send(line)\r
+ else:\r
+ # parent -- read socket, write stdout\r
+ iac = 0 # Interpret next char as command\r
+ opt = '' # Interpret next char as option\r
+ while 1:\r
+ data = s.recv(BUFSIZE)\r
+ if not data:\r
+ # EOF; kill child and exit\r
+ sys.stderr.write( '(Closed by remote host)\n')\r
+ posix.kill(pid, 9)\r
+ sys.exit(1)\r
+ cleandata = ''\r
+ for c in data:\r
+ if opt:\r
+ print ord(c)\r
+ s.send(opt + c)\r
+ opt = ''\r
+ elif iac:\r
+ iac = 0\r
+ if c == IAC:\r
+ cleandata = cleandata + c\r
+ elif c in (DO, DONT):\r
+ if c == DO: print '(DO)',\r
+ else: print '(DONT)',\r
+ opt = IAC + WONT\r
+ elif c in (WILL, WONT):\r
+ if c == WILL: print '(WILL)',\r
+ else: print '(WONT)',\r
+ opt = IAC + DONT\r
+ else:\r
+ print '(command)', ord(c)\r
+ elif c == IAC:\r
+ iac = 1\r
+ print '(IAC)',\r
+ else:\r
+ cleandata = cleandata + c\r
+ sys.stdout.write(cleandata)\r
+ sys.stdout.flush()\r
+\r
+\r
+try:\r
+ main()\r
+except KeyboardInterrupt:\r
+ pass\r