当stdin设置为套接字时,code.interact()不理解箭头键

时间:2017-07-25 21:39:45

标签: python python-2.7 python-sockets

通过将stdinstdoutstderr设置为套接字,然后调用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())
    )

0 个答案:

没有答案