我经历了多个具有类似问题(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
无法解决这个问题。
我知道有多个类似Paramiko
和fabric
的库,它们可以很轻松地处理远程连接,但是由于我不是直接{{ 1}}到一台计算机上,而不是从本地计算机上使用ssh
命令
答案 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