我正在编写一个python脚本来为用户生成SSH密钥。在使用ssh-keygen生成它们之后,我想使用puttygen创建一个.ppk文件。不幸的是,puttygen不允许在命令行上提供密码短语,因此我试图使用popen将它们导入stdin。它总是抱怨“错误的密码短语”,但是在命令行输入命令并在那里输入密码短语可以很好地工作——这是我的popen技术中的问题。puttygen三次提示输入密码短语—一次读取openssh生成的密钥,两次输入新文件的密钥。Puttygen在第一个提示后报告一个错误,因此问题在于我试图将密码短语发送到子流程。
该平台是Ubuntu 11.10、python 2.7、最新的openssh和putty工具包。这里有一个简短的脚本来说明我遇到的问题:

#!/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()

最佳答案

看起来puttygen把这三个密码都读成了第一个。最简单的解决方案是插入

time.sleep(0.1)

之间
p.stdin.write(phrase + '\n')

10-08 08:23