2

プログラムの stdout ストリームをネットワーク経由で、別のホストで実行されている別のプログラムの stdin に送信する必要があります。

これは、ssh を使用して簡単に実行できます。

program 1 | ssh host 'program 2'

を使用してこれを呼び出すのは簡単subprocessです:

subprocess.call("program 1 | ssh host 'program 2'", shell=True)

ただし、リモート ホストで他の多くのコマンドを実行する必要があるため、fabricを使用しています。

ファブリックを使用してファイルを送信するのは簡単ですが、ストリームの送信に関するドキュメントは見つかりません。fabric が paramiko ssh ライブラリを使用していることは知っているので、そのチャネルを使用できましたが、fabric からチャネルにアクセスするためのドキュメントはないようです。

4

1 に答える 1

0

ファブリックのソース コード ( fabric.operations._execute) を調べた結果、次のようになりました。

from fabric.state import default_channel
import subprocess

def remote_pipe(local_command, remote_command, buf_size=1024):
    '''executes a local command and a remove command (with fabric), and 
    sends the local's stdout to the remote's stdin.
    based on fabric.operations._execute'''
    local_p= subprocess.Popen(local_command, shell=True, stdout=subprocess.PIPE)
    channel= default_channel() #fabric function
    channel.set_combine_stderr(True)
    channel.exec_command( remote_command )
    read_bytes= local_p.stdout.read(buf_size)
    while read_bytes:
        channel.sendall(read_bytes)
        read_bytes= local_p.stdout.read(buf_size)
    local_ret= local_p.wait()
    channel.shutdown_write()
    received= channel.recv(640*1024) #ought to be enough for everyone
    remote_ret= channel.recv_exit_status()
    if local_ret!=0 or remote_ret!=0:
        raise Exception("remote_pipe failed: "+received)
于 2013-10-26T15:29:22.960 に答える