【问题标题】:Main Python Process is stopped using subprocess calls in SocketServer使用 SocketServer 中的子进程调用停止主 Python 进程
【发布时间】:2012-06-21 05:10:03
【问题描述】:

我正在尝试实现一种反向终端: 在某些计算机 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 进程会停止,我怎样才能阻止它发生?

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

非常感谢。

【问题讨论】:

  • 在我看来,您在包含 python 程序的终端窗口中按下了CTRL-Z
  • 绝对不是这样的。当作业停止时,该终端窗口甚至没有打开。它确实表现得好像它捕捉到了那个信号(无论 ctrl-z 发送什么信号。)

标签: python sockets


【解决方案1】:

我想通了。问题在于调用 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()

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

【讨论】:

    猜你喜欢
    • 2018-10-30
    • 2016-08-23
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多