子流程.Popen不断询问ssh复制id命令的密码



我经历了多个有类似问题的线程(使用子进程发送密码(,尝试了很多事情,但仍然无法使其正常工作。基本上,我想把我的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,它们可以轻松地处理远程连接,但我不认为在这种情况下可以使用,因为我不是直接ssh连接到机器,而是使用来自本地机器的ssh-copy-id命令

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('rn')
for data in cmd_output:
print data

最新更新