1

我经历了多个有类似问题的线程(使用子进程发送密码)并尝试了很多东西,但我仍然无法让它工作。基本上我想将我的 ssh 密钥推送到一堆机器上,我正在尝试使用subprocess. 但不知何故subprocess.Popen无法获得密码,因此卡住了。

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

from subprocess import Popen, PIPE

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

我还尝试通过写入进程的标准输入通道来提供密码,如下所示

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

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

我知道人们已经建议使用Pexpect这个,但我更想知道为什么subprocess不能处理这个。

我知道有多个库,例如Paramiko并且也fabric可以轻松处理远程连接,但我认为在这种情况下不能使用它,因为我不是直接连接ssh到机器,而是使用ssh-copy-id来自本地机器的命令

4

1 回答 1

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
于 2018-11-28T15:15:05.653 回答