subprocess.Popen继续询问ssh-copy-id命令的密码

时间:2018-11-28 14:01:42

标签: python ssh subprocess

我经历了多个具有类似问题(Use subprocess to send a password)的线程,并尝试了很多方法,但仍然无法正常工作。基本上,我想将ssh密钥推到一堆机器上,而我正在尝试使用subprocess来完成。但是以某种方式subprocess.Popen无法获得密码,因此卡住了。

下面是我尝试过的一些事情。

from subprocess import Popen, PIPE

p = Popen(['ssh-copy-id', 'testbox1'], stdin=PIPE, stdout=PIPE).communicate(input=b'mypassword')

我还尝试通过写入进程的stdin通道(如下所示)来提供密码

p.stdin.write(b'mypassword')
p.stdin.flush()

我已经在python 2.7和python中都尝试过了,但是没有用。我也尝试过在密码后也提供换行符,但即使这样也不起作用。我不确定我在这里想念什么。

我知道人们已经建议为此使用Pexpect,但是我还是更想知道为什么subprocess无法解决这个问题。

我知道有多个类似Paramikofabric的库,它们可以很轻松地处理远程连接,但是由于我不是直接{{ 1}}到一台计算机上,而不是从本地计算机上使用ssh命令

1 个答案:

答案 0 :(得分:1)

subprocess处理似乎很棘手,因此我不得不pexpect来解决这个问题,并且一开始就奏效。

import pexpect
from getpass import getpass

pwd = getpass("password: ")

child = pexpect.spawn('ssh-copy-id testbox1')
child.expect('.*ssword.*:')
child.sendline(pwd)
child.expect(pexpect.EOF, timeout=None)
cmd_show_data = child.before
cmd_output = cmd_show_data.split('\r\n')
for data in cmd_output:
    print data