如何使用python结构发送流

时间:2013-10-25 18:22:31

标签: python ssh stream fabric paramiko

我需要通过网络将程序的stdout流发送到另一个程序的stdin,在另一个主机上运行。

这可以使用ssh轻松完成:

program 1 | ssh host 'program 2'

使用subprocess

来调用它是微不足道的
subprocess.call("program 1 | ssh host 'program 2'", shell=True)

但是,由于我需要在远程主机上运行许多其他命令,我正在使用fabric

使用结构发送文件很简单,但我找不到有关发送流的任何文档。我知道fabric使用了paramiko ssh库,所以我可以use it's channel但似乎没有文档可以从结构访问该通道。

1 个答案:

答案 0 :(得分: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)