如何使用subprocess.Popen将多个输入发送到远程shell

时间:2011-09-30 11:49:36

标签: python subprocess

我尝试在远程计算机上运行多个命令,然后在该终端上执行ssh,然后在其终端上运行命令。

我想使用子进程来完成这项工作。所以我写了以下命令: -

import subprocess
process = subprocess.Popen(['ssh', 'rahul@172.20.70.121'], shell=False, stdin=subprocess.PIPE)

现在我得到了远程机器的终端,并传递了以下命令,该命令在该机器上执行: -

print process.communicate('python test.py /home/rahul/vPath-dissector')

但是当我再次调用最后一个被调用的命令时,它会出错: -

print process.communicate('python temp.py /home/rahul/vPath-dissector')
   Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
   File "/usr/lib/python2.6/subprocess.py", line 690, in communicate
   self.stdin.write(input)
   ValueError: I/O operation on closed file

那么我可以用什么命令发送多个命令而不关闭文件???

3 个答案:

答案 0 :(得分:2)

试图找到同一问题的答案,我最终使用pexpect而不是子进程。

import pexpect

ssh = pexpect.spawn('ssh rahul@172.20.70.121')

prompts = [">", "#", "\$", "}", '%', pexpect.TIMEOUT]
ssh.sendline('echo Hello')
ssh.expect(prompts)
print ssh.before

对于特定的ssh,甚至有pxssh

答案 1 :(得分:0)

由于您明确询问了subprocess.Popen,因此不确定这是否对您有用 - 仍然可以使用

从shell执行远程命令
ssh rahul@172.20.70.121 python test.py /home/rahul/vPath-dissector

当然还有来自python的

os.system("ssh rahul@172.20.70.121 python test.py /home/rahul/vPath-dissector")

您还可以捕获此命令的输出。

很抱歉,如果我错过了你的观点,不过......

答案 2 :(得分:0)

几年前,当我遇到类似问题时,我最终使用了Python Cookbook中的recipe。显然它现在也可以从Pypi获得,但我不知道它是否完全相同。