リモートでシステムコマンドを実行するサーバとpopenの使用
4470 ワード
tcpサーバの作成
tcpサーバを作成するには、次の手順に従います. socket を作成 socketローカルアドレスとポート をバインド socketリスニングを開始 無限ループいつでもメッセージを受信する準備 はaccept()を実行してクライアント要求接続を待機し、クライアントとの通信を専門とするsocketおよびクライアントのアドレスを返す. クライアントから送信データ を新しいsocketで受信する.受信データに対する処理結果 を新しいsocketで送信する.
コードは次のとおりです.
os.popenの説明
popen()関数は、ファイルオブジェクトとsystem()関数の結合です.動作はsystem()と同じですが、プログラムへの一方向接続を作成し、接続を返すことができます.この接続はファイルオブジェクトであり、次のような役割を果たします. popenが実行するコマンドはpopenが返すファイルオブジェクトにリダイレクトされ、コマンドの印刷結果 を読み取ることができます.プログラムが入力を要求する場合、popenを呼び出すために「w」モードでそのコマンドを書き込むことができる.リファレンスサーバコードでのpopenの使用:
dataは実行するコマンドです.popenはファイルオブジェクトを返します.オブジェクトの読み取り操作を呼び出し、コマンドの印刷内容を返します.
クライアントを作成してサーバをテストサーバsocketと同じタイプのsocket を作成サーバアドレスおよびポート に接続する.は、実行するコマンド であるデータを送信する.は、サーバからの返信結果を受信する.
tcpサーバを作成するには、次の手順に従います.
コードは次のとおりです.
#!/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()と同じですが、プログラムへの一方向接続を作成し、接続を返すことができます.この接続はファイルオブジェクトであり、次のような役割を果たします.
tcpCliSock.send('%s' % os.popen(data).read())
dataは実行するコマンドです.popenはファイルオブジェクトを返します.オブジェクトの読み取り操作を呼び出し、コマンドの印刷内容を返します.
クライアントを作成してサーバをテスト
#!/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()