blob: 9ffe13ab4feec53043d39b94f7f8a26496a6b066 [file] [log] [blame]
Georg Brandl856898b2010-12-30 22:11:50 +00001#!/usr/bin/env python3
Guido van Rossum4e620371995-04-10 11:46:03 +00002
Georg Brandl856898b2010-12-30 22:11:50 +00003"""
4Remote python server.
5Execute Python commands remotely and send output back.
6
7WARNING: This version has a gaping security hole -- it accepts requests
8from any host on the Internet!
9"""
Guido van Rossum4e620371995-04-10 11:46:03 +000010
11import sys
Georg Brandl7fafbc92010-12-30 21:33:07 +000012from socket import socket, AF_INET, SOCK_STREAM
Collin Winter6f2df4d2007-07-17 20:59:35 +000013import io
Guido van Rossum4e620371995-04-10 11:46:03 +000014import traceback
15
16PORT = 4127
17BUFSIZE = 1024
18
19def main():
Tim Peterse6ddc8b2004-07-18 05:56:09 +000020 if len(sys.argv) > 1:
Georg Brandl7fafbc92010-12-30 21:33:07 +000021 port = int(sys.argv[1])
Tim Peterse6ddc8b2004-07-18 05:56:09 +000022 else:
23 port = PORT
24 s = socket(AF_INET, SOCK_STREAM)
25 s.bind(('', port))
26 s.listen(1)
Georg Brandl7fafbc92010-12-30 21:33:07 +000027 while True:
Tim Peterse6ddc8b2004-07-18 05:56:09 +000028 conn, (remotehost, remoteport) = s.accept()
Georg Brandl7fafbc92010-12-30 21:33:07 +000029 print('connection from', remotehost, remoteport)
30 request = b''
Tim Peterse6ddc8b2004-07-18 05:56:09 +000031 while 1:
32 data = conn.recv(BUFSIZE)
33 if not data:
34 break
Georg Brandl7fafbc92010-12-30 21:33:07 +000035 request += data
36 reply = execute(request.decode())
37 conn.send(reply.encode())
Tim Peterse6ddc8b2004-07-18 05:56:09 +000038 conn.close()
Guido van Rossum4e620371995-04-10 11:46:03 +000039
40def execute(request):
Tim Peterse6ddc8b2004-07-18 05:56:09 +000041 stdout = sys.stdout
42 stderr = sys.stderr
Collin Winter6f2df4d2007-07-17 20:59:35 +000043 sys.stdout = sys.stderr = fakefile = io.StringIO()
Tim Peterse6ddc8b2004-07-18 05:56:09 +000044 try:
45 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +000046 exec(request, {}, {})
Tim Peterse6ddc8b2004-07-18 05:56:09 +000047 except:
Collin Winter6f2df4d2007-07-17 20:59:35 +000048 print()
Tim Peterse6ddc8b2004-07-18 05:56:09 +000049 traceback.print_exc(100)
50 finally:
51 sys.stderr = stderr
52 sys.stdout = stdout
53 return fakefile.getvalue()
Guido van Rossum4e620371995-04-10 11:46:03 +000054
Georg Brandl7fafbc92010-12-30 21:33:07 +000055try:
56 main()
57except KeyboardInterrupt:
58 pass