【发布时间】:2014-09-01 12:56:26
【问题描述】:
本质上是在问同样的事情,但答案对我不起作用的相关问题:
Make python enter password when running a csh script
How to interact with ssh using subprocess module
How to execute a process remotely using python
我想通过 ssh 连接到一台远程机器并运行一个命令。例如:
ssh <user>@<ipv6-link-local-addr>%eth0 sudo service fooService status
问题是我试图通过一个只有标准库(没有pexpect)的python脚本来做到这一点。我一直在尝试使用subprocess 模块使其工作,但在请求密码时调用communicate 总是阻塞,即使我将密码作为参数提供给communicate。例如:
proc = subprocess.Popen(
[
"ssh",
"{testUser1}@{testHost1}%eth0".format(**locals()),
"sudo service cassandra status"],
shell=False,
stdin=subprocess.PIPE)
a, b = proc.communicate(input=testPasswd1)
print "a:", a, "b:", b
print "return code: ", proc.returncode
我也尝试了上述的一些变体(例如,删除“input=”,添加/删除subprocess.PIPE 分配给stdout 和sterr)。但是,结果总是一样的提示:
ubuntu@<ipv6-link-local-addr>%eth0's password:
我错过了什么吗?或者还有其他方法可以使用 python 标准库来实现吗?
【问题讨论】:
-
您尝试过this answer 的建议吗?这在 Linux 环境中对我来说很好。如果你在 Windows 上,我想你可能不走运......
-
您需要提供两次密码,一次用于客户端的 ssh,一次用于服务器端的 sudo。 如何使用子进程模块与 ssh 进行交互对我来说看起来很合理,并且可以针对 sudo 部分进行修改......那它对你不起作用呢?
-
@tdelaney,服务器上没有 sudo 的密码。似乎“如何交互......”解决方案可能有效,但我需要获取其中一个命令的输出,而简单的读取没有返回任何内容。
标签: python ssh subprocess