+++ /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