通过将stdin
,stdout
,stderr
设置为套接字,然后调用code.interact()
,我可以创建一个类似于manhole的轻量级远程交互式Python shell。
当我通过^[[C
连接到它时,除了显示nc localhost 1337
之类的箭头键外,其效果非常好。
这不是没有安装readline
的问题,因为即使我运行code.interact()
手动启动解释器也能正常工作。该问题仅通过套接字发生。我可以在我的远程shell中import readline
但是什么也没做。
也许我在readline
遗漏了与SocketWrapper.read()
相关的内容?
import socket
import sys
import readline
readline.parse_and_bind('tab: complete') # doesn't work
import code
port = 1337
while True:
sock = socket.socket()
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('', port))
sock.listen(1)
print("~Listening on port %d~" % port)
connection, connection_addr = sock.accept()
print("Accepted connection from %s." % (connection_addr,))
class SocketWrapper:
def __init__(self, sock):
self.sock = sock
def read(self, length):
return self.sock.recv(length)
def write(self, text):
return self.sock.send(text)
def readline(self):
return self.sock.makefile().readline()
sockfile = SocketWrapper(connection)
sys.stdin = sockfile
sys.stdout = sockfile
sys.stderr = sockfile
code.interact(
local=dict(globals(), **locals())
)