GitとRsyncのようなプログラムがSSH接続を介してデータをやりとりする方法を再現しようとしています。これらのプログラムは、サーバー側でプロセスを開始するSSHコマンドを実行して実行し、フォークされた子プロセスのSTDINおよびSTDOUTと通信する親プロセスによって通信が行われることを理解しています。Python - ソケット上でサブプロセスと通信する
CIでは、プロセスをフォークし、フォークされたプロセスのstdin/stdoutを子プロセスのs1に指定してから、ソケットに読み書きすることで、Unixソケットペア(s0、s1)親プロセス上のs0。
私はPython3でも同じことをしたいと思います。概念実証として、ここではソケットダウンコマンドを送信し、同じソケットからの出力を受けおもちゃリモートシェルの私の実装です:
import subprocess
import socket
ssh_cmd = 'ssh -q -T [email protected]'
s_local, s_remote = socket.socketpair(socket.AF_UNIX, socket.SOCK_STREAM)
ssh = subprocess.Popen(ssh_cmd, shell=True,
stdout=s_remote,
stdin=s_remote,
close_fds=True)
s_remote.close()
s_local.send('ls -l\n'.encode())
print(s_local.recv(1024).decode())
s_local.send('uname -a\n'.encode())
print(s_local.recv(1024).decode())
s_local.close()
ssh.kill()
作品のこの種。しかし、 'recv'がブロックされているので、本当の\ n 'をソケットの下に送るとデッドロックすることができます。
- これはネットワークプログラミングでは分かりやすいことですか?
- デッドロックしないPython3標準ライブラリを使用してこれを行う方法は、もっと慣れていますか?
あなたがしようとしていることは、かなり賢明です。あなたは 'pexpect'モジュールを調べたいかもしれません。これは、対話型のアプリケーションを駆動するこの種のものに合わせて作られています。良いスタートについてはhttps://pexpect.readthedocs.io/en/stable/overview.htmlを参照してください。それはあなたが応答を期待しているが、何も得られない場合に備えて、あなたの相互作用にタイムアウトを置く能力を持っています。 –