blob: fe24b3df94d4baa24a451158a187965c28f17019 [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#! /usr/bin/env python3
Guido van Rossum4e620371995-04-10 11:46:03 +00002
3# Remote python server.
4# Execute Python commands remotely and send output back.
5# WARNING: This version has a gaping security hole -- it accepts requests
6# from any host on the Internet!
7
8import sys
Georg Brandl7fafbc92010-12-30 21:33:07 +00009from socket import socket, AF_INET, SOCK_STREAM
Collin Winter6f2df4d2007-07-17 20:59:35 +000010import io
Guido van Rossum4e620371995-04-10 11:46:03 +000011import traceback
12
13PORT = 4127
14BUFSIZE = 1024
15
16def main():
Tim Peterse6ddc8b2004-07-18 05:56:09 +000017 if len(sys.argv) > 1:
Georg Brandl7fafbc92010-12-30 21:33:07 +000018 port = int(sys.argv[1])
Tim Peterse6ddc8b2004-07-18 05:56:09 +000019 else:
20 port = PORT
21 s = socket(AF_INET, SOCK_STREAM)
22 s.bind(('', port))
23 s.listen(1)
Georg Brandl7fafbc92010-12-30 21:33:07 +000024 while True:
Tim Peterse6ddc8b2004-07-18 05:56:09 +000025 conn, (remotehost, remoteport) = s.accept()
Georg Brandl7fafbc92010-12-30 21:33:07 +000026 print('connection from', remotehost, remoteport)
27 request = b''
Tim Peterse6ddc8b2004-07-18 05:56:09 +000028 while 1:
29 data = conn.recv(BUFSIZE)
30 if not data:
31 break
Georg Brandl7fafbc92010-12-30 21:33:07 +000032 request += data
33 reply = execute(request.decode())
34 conn.send(reply.encode())
Tim Peterse6ddc8b2004-07-18 05:56:09 +000035 conn.close()
Guido van Rossum4e620371995-04-10 11:46:03 +000036
37def execute(request):
Tim Peterse6ddc8b2004-07-18 05:56:09 +000038 stdout = sys.stdout
39 stderr = sys.stderr
Collin Winter6f2df4d2007-07-17 20:59:35 +000040 sys.stdout = sys.stderr = fakefile = io.StringIO()
Tim Peterse6ddc8b2004-07-18 05:56:09 +000041 try:
42 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +000043 exec(request, {}, {})
Tim Peterse6ddc8b2004-07-18 05:56:09 +000044 except:
Collin Winter6f2df4d2007-07-17 20:59:35 +000045 print()
Tim Peterse6ddc8b2004-07-18 05:56:09 +000046 traceback.print_exc(100)
47 finally:
48 sys.stderr = stderr
49 sys.stdout = stdout
50 return fakefile.getvalue()
Guido van Rossum4e620371995-04-10 11:46:03 +000051
Georg Brandl7fafbc92010-12-30 21:33:07 +000052try:
53 main()
54except KeyboardInterrupt:
55 pass