| #!/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 |