【发布时间】: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 发送什么信号。)