telnet.py 3.06 KB
Newer Older
Guido van Rossum's avatar
Guido van Rossum committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
# Minimal interface to the Internet telnet protocol.
#
# *** modified to use threads ***
#
# It refuses all telnet options and does not recognize any of the other
# telnet commands, but can still be used to connect in line-by-line mode.
# It's also useful to play with a number of other services,
# like time, finger, smtp and even ftp.
#
# Usage: telnet host [port]
#
# The port may be a service name or a decimal port number;
# it defaults to 'telnet'.


import sys, os, time
from socket import *
18
import _thread as thread
Guido van Rossum's avatar
Guido van Rossum committed
19 20 21 22 23

BUFSIZE = 8*1024

# Telnet protocol characters

Tim Peters's avatar
Tim Peters committed
24
IAC  = chr(255) # Interpret as command
Guido van Rossum's avatar
Guido van Rossum committed
25 26 27 28 29 30
DONT = chr(254)
DO   = chr(253)
WONT = chr(252)
WILL = chr(251)

def main():
Tim Peters's avatar
Tim Peters committed
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
    if len(sys.argv) < 2:
        sys.stderr.write('usage: telnet hostname [port]\n')
        sys.exit(2)
    host = sys.argv[1]
    try:
        hostaddr = gethostbyname(host)
    except error:
        sys.stderr.write(sys.argv[1] + ': bad host name\n')
        sys.exit(2)
    #
    if len(sys.argv) > 2:
        servname = sys.argv[2]
    else:
        servname = 'telnet'
    #
    if '0' <= servname[:1] <= '9':
        port = eval(servname)
    else:
        try:
            port = getservbyname(servname, 'tcp')
        except error:
            sys.stderr.write(servname + ': bad tcp service name\n')
            sys.exit(2)
    #
    s = socket(AF_INET, SOCK_STREAM)
    #
    try:
        s.connect((host, port))
59
    except error as msg:
60
        sys.stderr.write('connect failed: %r\n' % (msg,))
Tim Peters's avatar
Tim Peters committed
61 62 63 64
        sys.exit(1)
    #
    thread.start_new(child, (s,))
    parent(s)
Guido van Rossum's avatar
Guido van Rossum committed
65 66

def parent(s):
Tim Peters's avatar
Tim Peters committed
67 68 69 70 71 72 73 74 75 76 77 78
    # read socket, write stdout
    iac = 0         # Interpret next char as command
    opt = ''        # Interpret next char as option
    while 1:
        data, dummy = s.recvfrom(BUFSIZE)
        if not data:
            # EOF -- exit
            sys.stderr.write( '(Closed by remote host)\n')
            sys.exit(1)
        cleandata = ''
        for c in data:
            if opt:
79
                print(ord(c))
80
##                              print '(replying: %r)' % (opt+c,)
Tim Peters's avatar
Tim Peters committed
81 82 83 84 85 86 87
                s.send(opt + c)
                opt = ''
            elif iac:
                iac = 0
                if c == IAC:
                    cleandata = cleandata + c
                elif c in (DO, DONT):
88 89
                    if c == DO: print('(DO)', end=' ')
                    else: print('(DONT)', end=' ')
Tim Peters's avatar
Tim Peters committed
90 91
                    opt = IAC + WONT
                elif c in (WILL, WONT):
92 93
                    if c == WILL: print('(WILL)', end=' ')
                    else: print('(WONT)', end=' ')
Tim Peters's avatar
Tim Peters committed
94 95
                    opt = IAC + DONT
                else:
96
                    print('(command)', ord(c))
Tim Peters's avatar
Tim Peters committed
97 98
            elif c == IAC:
                iac = 1
99
                print('(IAC)', end=' ')
Tim Peters's avatar
Tim Peters committed
100 101 102 103
            else:
                cleandata = cleandata + c
        sys.stdout.write(cleandata)
        sys.stdout.flush()
104
##              print 'Out:', repr(cleandata)
Guido van Rossum's avatar
Guido van Rossum committed
105 106

def child(s):
Tim Peters's avatar
Tim Peters committed
107 108 109
    # read stdin, write socket
    while 1:
        line = sys.stdin.readline()
110
##              print 'Got:', repr(line)
Tim Peters's avatar
Tim Peters committed
111 112
        if not line: break
        s.send(line)
Guido van Rossum's avatar
Guido van Rossum committed
113 114

main()