私は一種のリバースターミナルを実装しようとしています:いくつかのコンピュータfooでserver.pyを起動します。
他のいくつかのコンピューターでncfoo2000を実行すると、fooのbashシェルに接続されます。
次のサーバーコードを使用しています。
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()
これは、一度に1つの接続のみを行う場合に最適です。
ただし、2番目の接続を開くと、ncプログラムは待機状態になり、Pythonプロセスに次のメッセージが表示されます。
[1]+ Stopped python server.py
%1と入力してプロセスを前面に表示すると、2番目のnc画面が機能し始め、2つのリモートbashシェルがあります。
私の質問は、Pythonプロセスが停止する理由と、それが発生しないようにするにはどうすればよいですか?
私が知る限り、何もブロックされていません。プロセスを復活させると、すべてが完全に機能するからです。
どうもありがとう。