サーバーに接続するアプリを作成する必要があります。いくつかのメッセージを送信した後、ユーザーはコマンドを送信して結果を受信することでサーバーと対話できるようになります。
ユーザーが stdin/stdout から/へ入力を読み取ったり、出力を書き込んだりすることなくサーバーと対話できるようにするには、現在のソケットをどのようにパイプすればよいですか?
netcatを使うのが好きですか?
cat initial_command_file - | nc host:port
答えは、何かが読み書きする必要があるということです。上記のサンプルシェルスクリプトではcat
、2つのソースから順番に読み取り、1つのパイプに書き込みます。nc
そのパイプから読み取り、ソケットに書き込みますが、ソケットから読み取り、そのに書き込みますstdout
。
したがって、常に読み取りと書き込みが行われます...ただし、通信ロジックに侵入しないようにコードを構造化することができます。
たとえば、itertools.chainを使用して、と同様に動作する入力イテレータを作成しますcat
。これにより、TCPに面したコードは単一の入力イテレータを使用できます。
def netcat(input, output, remote):
"""trivial example for 1:1 request-response protocol"""
for request in input:
remote.write(request)
response = remote.read()
output.write(response)
handshake = ['connect', 'initial', 'handshake', 'stuff']
cat = itertools.chain(handshake, sys.stdin)
server = ('localhost', 9000)
netcat(cat, sys.stdout, socket.create_connection(server))
あなたはおそらくpexpectのようなものが欲しいでしょう。基本的にはspawn
、接続を開始するオブジェクトを作成し(たとえば、経由でssh
)、そのオブジェクトexpect()
とsendline()
メソッドを使用して、プロンプトで送信するコマンドを発行します。次に、このinteract()
メソッドを使用して、ユーザーに制御を渡すことができます。