我需要通过网络将程序的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但似乎没有文档可以从结构访问该通道。
答案 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)