【发布时间】:2012-04-02 05:02:12
【问题描述】:
我正在编写一个 python 脚本来为用户生成 SSH 密钥。使用 ssh-keygen 生成它们后,我想使用 puttygen 创建一个 .ppk 文件。不幸的是,puttygen 不允许在命令行上提供密码短语——因此我试图使用 popen 将它们通过管道传输到它的标准输入中。它总是抱怨“密码错误”,但在命令行输入命令并在那里输入密码可以正常工作 - 问题出在我的 popen 技术中。 puttygen 提示输入密码 3 次 - 一次读取 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()
【问题讨论】: