0

我正在尝试实现一种反向终端:在某些计算机 foo 上启动 server.py。

在其他一些计算机上运行 nc foo 2000 并且您连接到 foo 上的 bash shell。

我正在使用以下服务器代码:

import socket,os,threading,select,subprocess                                                                                             

class mysocket(socket.socket):

    def __init__(self,*arg, **kw):
        super(mysocket,self).__init__(*arg, **kw)
        self.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.setblocking(0)


    def read(self):
        return self.recv(2048)

    def write(self,data):
        self.send(data)

    def accept(self):
        conn,addr = super(mysocket,self).accept()
        return mysocket(_sock=conn),addr

socket.socket = mysocket

import SocketServer

class RequestHandler(SocketServer.BaseRequestHandler):

    def handle(self):
        subprocess.call(['bash','-i'],env=os.environ,stdin=self.request,stdout=self.request,stderr=self.request)

class ForkedTCPServer(SocketServer.ForkingMixIn, SocketServer.TCPServer):
    pass

if __name__ == '__main__':

    address = ('0.0.0.0', 2000) # let the kernel give us a port
    server = ForkedTCPServer(address, RequestHandler)

    server.serve_forever()

如果您一次只进行一个连接,这将非常有效。

但是,当我打开第二个连接时,nc 程序正在等待,我的 python 进程有以下消息:

[1]+  Stopped                 python server.py

如果我键入 %1 将进程置于前台,则第二个 nc 屏幕开始工作,并且我有两个远程 bash shell。

我的问题是为什么 python 进程会停止,我怎样才能阻止它发生?

据我所知,没有什么是阻塞的,因为一旦我恢复了这个过程,一切都会完美运行!

非常感谢。

4

1 回答 1

2

我想到了。问题在于调用 bash,因为其他事情会起作用。

最终,我一时兴起尝试使用脚本命令调用 bash,它按预期工作。

这是任何想要它的人的一些最终代码:

import socket,os,threading,subprocess                                                                                                    

class mysocket(socket.socket):

    def __init__(self,*arg, **kw):
        super(mysocket,self).__init__(*arg, **kw)
        self.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    def read(self):
        return self.recv(2048)

    def write(self,data):
        self.send(data)

    def accept(self):
        conn,addr = super(mysocket,self).accept()
        return mysocket(_sock=conn),addr

socket.socket = mysocket

import SocketServer

class RequestHandler(SocketServer.BaseRequestHandler):

    def handle(self):
        subprocess.call('script -q -f -c "bash -i" /dev/null',shell=True,env=os.environ,stdin=self.request,stdout=self.request,stderr=self.request)

class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
    pass

if __name__ == '__main__':
    address = ('0.0.0.0', 2000)
    server = ThreadedTCPServer(address, RequestHandler)
    server.serve_forever()

请注意,这在 Windows 上不起作用,因为 python 不支持在该平台上使用套接字作为文件。但是它在cygwin上完美运行。只需从 cygwin 的 setup.exe 安装 python 和 util-linux(用于脚本命令)。

于 2012-06-23T00:46:27.200 回答