0

私は一種のリバースターミナルを実装しようとしています:いくつかのコンピュータ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プロセスが停止する理由と、それが発生しないようにするにはどうすればよいですか?

私が知る限り、何もブロックされていません。プロセスを復活させると、すべてが完全に機能するからです。

どうもありがとう。

4

1 に答える 1

2

私はそれを考え出した。問題は、他のものが機能するので、bashを呼び出すことでした。

最終的に気まぐれで、scriptコマンドを使用して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(スクリプトコマンド用)をインストールするだけです。

于 2012-06-23T00:46:27.200 に答える