Python:用ssh连接替换shell管道

2024-09-27 23:24:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下不错的bash命令:

cat SomePythonScript.py | ssh remote_machine 'cat - | python'

这很好,我想用Python编写。我试过使用“subprocess”,但没有走那么远。有人能帮我吗?在

^{pr2}$

我也尝试了2个进程/管道

from  subprocess import PIPE , Popen  
p1 = Popen([["cat", "SomePythonScript.py"], stdout=PIPE)
p2 = Popen(["remote_machine","cat", "- python"], stdin=p1.stdout,    stdout=PIPE)
p1.stdout.close() 
output = p2.communicate()[0]

我很乐意为您提供任何帮助、建议、建议、解释和解决方案。。。提前厚度


Tags: py命令bashremotestdoutmachinessh建议
2条回答

你使用Popen没有错。唯一错误的地方是您缺少ssh命令,并且您试图模拟的bash命令中只有两个进程时您试图运行三个进程'cat - | python'只是ssh命令的一个参数。在

以下命令应该更好地模拟bash命令:

from subprocess import  PIPE , Popen

p1 = Popen(["cat", "SomePythonScript.py"], stdout=PIPE)
p2 = Popen(["ssh", "remote_machine", "cat - | python"], stdin=p1.stdout, stdout=PIPE)

p1.stdout.close()  

output = p2.communicate()[0]

首先,复制useless use of cat是不值得的,即使您想要其余的管道。在

其次,很明显,尽管您包含了完全没有意义的cat命令,但您忽略了真正执行某些操作的唯一命令—尝试都不会运行ssh。在


编辑以备将来参考-既然公认的答案是仍然沉迷于cat的相同无用用途,那么代码应该是这样的:

from subprocess import  PIPE , Popen

p = Popen(["ssh", "remote_machine", "python"], 
          stdin=open("SomePythonScript.py",'r'), stdout=PIPE)
output = p.communicate()[0]

原来的shell代码首先应该是这样的:

^{pr2}$

你的原始代码包含

  • p1 = Popen([["cat", "SomePythonScript.py"], stdout=PIPE)
    

    它与open("SomePythonScript.py",'r')具有相同的效果,但以运行子进程为代价却毫无益处。

  • p2 = Popen(["ssh", "remote_machine", "cat - | python"], ...
    

    它在远程计算机上运行一个额外的冗余进程。由于cat -只是将其stdin复制到stdout,因此可以完全忽略它

相关问题 更多 >

    热门问题