リモートでシステムコマンドを実行するサーバとpopenの使用

4470 ワード

tcpサーバの作成
tcpサーバを作成するには、次の手順に従います.
  • socket
  • を作成
  • socketローカルアドレスとポート
  • をバインド
  • socketリスニングを開始
  • 無限ループいつでもメッセージを受信する準備
  • はaccept()を実行してクライアント要求接続を待機し、クライアントとの通信を専門とするsocketおよびクライアントのアドレスを返す.
  • クライアントから送信データ
  • を新しいsocketで受信する.
  • 受信データに対する処理結果
  • を新しいsocketで送信する.

    コードは次のとおりです.
    #!/usr/bin python
    
    from socket import *
    from time import ctime
    import os
    
    HOST=''
    PORT=21567
    BUFSIZE=1024
    ADDR=(HOST, PORT)
    
    #AF_INET  ipv4,SOCK_STREAM  TCP
    tcpSerSock = socket(AF_INET, SOCK_STREAM)
    tcpSerSock.bind(ADDR)
    tcpSerSock.listen(5)
    
    while True:
        print "waiting for connection..."
        #       
        tcpCliSock, addr = tcpSerSock.accept()
        print "...Connected form:", addr
    
        while True:
            #          
            data = tcpCliSock.recv(BUFSIZE)
            if not data:
                break
            try:
                #               ,            
                tcpCliSock.send('%s' % os.popen(data).read())
            except Exception,e:
                raise e
    
        tcpCliSock.close()
    
    tcpSerSock.close()

    os.popenの説明
    popen()関数は、ファイルオブジェクトとsystem()関数の結合です.動作はsystem()と同じですが、プログラムへの一方向接続を作成し、接続を返すことができます.この接続はファイルオブジェクトであり、次のような役割を果たします.
  • popenが実行するコマンドはpopenが返すファイルオブジェクトにリダイレクトされ、コマンドの印刷結果
  • を読み取ることができます.
  • プログラムが入力を要求する場合、popenを呼び出すために「w」モードでそのコマンドを書き込むことができる.リファレンスサーバコードでのpopenの使用:
  • tcpCliSock.send('%s' % os.popen(data).read())

    dataは実行するコマンドです.popenはファイルオブジェクトを返します.オブジェクトの読み取り操作を呼び出し、コマンドの印刷内容を返します.
    クライアントを作成してサーバをテスト
  • サーバsocketと同じタイプのsocket
  • を作成
  • サーバアドレスおよびポート
  • に接続する.
  • は、実行するコマンド
  • であるデータを送信する.
  • は、サーバからの返信結果を受信する.
  • #!/usr/bin python
    
    from socket import *
    
    HOST='localhost'
    PORT=21567
    BUFSIZE=1024
    ADDR=(HOST,PORT)
    
    tcpCliSock = socket(AF_INET, SOCK_STREAM)
    tcpCliSock.connect(ADDR)
    
    while True:
        data = raw_input('>')
        if not data:
            break
        tcpCliSock.send(data)
        data = tcpCliSock.recv(BUFSIZE)
        if not data:
            break
        print data
    
    tcpCliSock.close()