diff options
Diffstat (limited to 'Tools/demo/rpythond.py')
-rwxr-xr-x | Tools/demo/rpythond.py | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/Tools/demo/rpythond.py b/Tools/demo/rpythond.py new file mode 100755 index 0000000..fe24b3d --- /dev/null +++ b/Tools/demo/rpythond.py @@ -0,0 +1,55 @@ +#! /usr/bin/env python3 + +# Remote python server. +# Execute Python commands remotely and send output back. +# WARNING: This version has a gaping security hole -- it accepts requests +# from any host on the Internet! + +import sys +from socket import socket, AF_INET, SOCK_STREAM +import io +import traceback + +PORT = 4127 +BUFSIZE = 1024 + +def main(): + if len(sys.argv) > 1: + port = int(sys.argv[1]) + else: + port = PORT + s = socket(AF_INET, SOCK_STREAM) + s.bind(('', port)) + s.listen(1) + while True: + conn, (remotehost, remoteport) = s.accept() + print('connection from', remotehost, remoteport) + request = b'' + while 1: + data = conn.recv(BUFSIZE) + if not data: + break + request += data + reply = execute(request.decode()) + conn.send(reply.encode()) + conn.close() + +def execute(request): + stdout = sys.stdout + stderr = sys.stderr + sys.stdout = sys.stderr = fakefile = io.StringIO() + try: + try: + exec(request, {}, {}) + except: + print() + traceback.print_exc(100) + finally: + sys.stderr = stderr + sys.stdout = stdout + return fakefile.getvalue() + +try: + main() +except KeyboardInterrupt: + pass |