|
#! /usr/bin/env python |
|
|
|
# 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 * |
|
import StringIO |
|
import traceback |
|
|
|
PORT = 4127 |
|
BUFSIZE = 1024 |
|
|
|
def main(): |
|
if len(sys.argv) > 1: |
|
port = int(eval(sys.argv[1])) |
|
else: |
|
port = PORT |
|
s = socket(AF_INET, SOCK_STREAM) |
|
s.bind(('', port)) |
|
s.listen(1) |
|
while 1: |
|
conn, (remotehost, remoteport) = s.accept() |
|
print 'connected by', remotehost, remoteport |
|
request = '' |
|
while 1: |
|
data = conn.recv(BUFSIZE) |
|
if not data: |
|
break |
|
request = request + data |
|
reply = execute(request) |
|
conn.send(reply) |
|
conn.close() |
|
|
|
def execute(request): |
|
stdout = sys.stdout |
|
stderr = sys.stderr |
|
sys.stdout = sys.stderr = fakefile = StringIO.StringIO() |
|
try: |
|
try: |
|
exec request in {}, {} |
|
except: |
|
print |
|
traceback.print_exc(100) |
|
finally: |
|
sys.stderr = stderr |
|
sys.stdout = stdout |
|
return fakefile.getvalue() |
|
|
|
main() |