如何通过subprocess.Popen向远程shell发送多个输入

2 投票
3 回答
4182 浏览
提问于 2025-04-17 03:25

我想在远程电脑上运行多个命令,首先通过ssh连接到那台机器,然后在它的终端上执行命令。

我想用subprocess来完成这个工作。所以我写了以下命令:

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

我不确定这对你是否有帮助,因为你明确问了关于subprocess.Popen的内容。
不过,你可以直接在命令行中执行你的远程命令,方法是使用

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")

你还可以获取这个命令的输出结果。

如果我没有理解你的意思,抱歉哦...

0

几年前我遇到过类似的问题,最后我用了这个来自Python Cookbook的方法。听说现在这个方法也可以在Pypi上找到,不过我不确定那里的代码是不是完全一样。

2

我在寻找同样问题的答案时,最终选择了使用pexpect,而不是subprocess。

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的工具。

撰写回答