我正在编写一个python脚本来为用户生成SSH密钥。在使用ssh-keygen生成它们之后,我想使用puttygen来创建一个.ppk文件。不幸的是,puttygen不允许在命令行中提供密码短语-因此,我尝试使用popen将它们输入到它的stdin中。它总是抱怨“错误的密码短语”,但是在命令行中输入命令并在那里输入密码短语工作得很好-问题出在我的popen技术中。puttygen会提示三次输入密码-一次是读取openssh生成的密钥,两次是输入新文件的密钥。在第一次提示后,Puttygen报告了一个错误,所以问题出在我试图将密码发送给子进程。
平台是Ubuntu 11.10,python 2.7,最新的openssh和putty-tools包。这里有一个截断的脚本来说明我遇到的问题:
#!/usr/bin/python
import sys, os, subprocess
KEYGEN = "/usr/bin/ssh-keygen -t rsa -b 4096 -f id_rsa -N passphrase"
PUTTYGEN = "/usr/bin/puttygen id_rsa -P -O private -o test.ppk"
phrase = "passphrase"
try:
os.unlink('id_rsa')
except:
pass
try:
os.unlink('id_rsa.pub')
except:
pass
try:
os.unlink('test.ppk')
except:
pass
## generate the public and private keys
subprocess.call(KEYGEN.split(' '))
## convert key to PuTTY format
p = subprocess.Popen(PUTTYGEN.split(' '),
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
## Two techniques I've tried - also tried variations on CR/LF. No luck.
if False:
o, e = p.communicate(phrase + '\n' + phrase + '\n' + phrase + '\n')
#o, e = p.communicate(phrase + '\r' + phrase + '\r' + phrase + '\r')
#o, e = p.communicate(phrase + '\r\n' + phrase + '\r\n' + phrase + '\r\n')
print o
print e
else:
p.stdin.write(phrase + '\n')
p.stdin.write(phrase + '\n')
p.stdin.write(phrase + '\n')
print p.stdout.read()
print p.stderr.read()
p.stdin.close()
p.wait()发布于 2012-03-17 08:20:28
puttygen似乎将所有三个密码短语都读取为第一个密码短语。最简单的解决方案是插入
time.sleep(0.1) 在两者之间
p.stdin.write(phrase + '\n')发布于 2017-06-29 15:31:52
puttygen (在我的例子中是0.69)有新的选项:'-- old -passphrase file‘-指定包含旧密钥密码的文件,'-- new -passphrase file’-指定包含新密钥密码的文件。它通过'stdin‘问题回答密码短语。
https://stackoverflow.com/questions/9740887
复制相似问题