首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Popen控制puttygen

使用Popen控制puttygen
EN

Stack Overflow用户
提问于 2012-03-17 00:21:39
回答 2查看 999关注 0票数 3

我正在编写一个python脚本来为用户生成SSH密钥。在使用ssh-keygen生成它们之后,我想使用puttygen来创建一个.ppk文件。不幸的是,puttygen不允许在命令行中提供密码短语-因此,我尝试使用popen将它们输入到它的stdin中。它总是抱怨“错误的密码短语”,但是在命令行中输入命令并在那里输入密码短语工作得很好-问题出在我的popen技术中。puttygen会提示三次输入密码-一次是读取openssh生成的密钥,两次是输入新文件的密钥。在第一次提示后,Puttygen报告了一个错误,所以问题出在我试图将密码发送给子进程。

平台是Ubuntu 11.10,python 2.7,最新的openssh和putty-tools包。这里有一个截断的脚本来说明我遇到的问题:

代码语言:javascript
复制
#!/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()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-17 08:20:28

puttygen似乎将所有三个密码短语都读取为第一个密码短语。最简单的解决方案是插入

代码语言:javascript
复制
time.sleep(0.1) 

在两者之间

代码语言:javascript
复制
p.stdin.write(phrase + '\n')
票数 1
EN

Stack Overflow用户

发布于 2017-06-29 15:31:52

puttygen (在我的例子中是0.69)有新的选项:'-- old -passphrase file‘-指定包含旧密钥密码的文件,'-- new -passphrase file’-指定包含新密钥密码的文件。它通过'stdin‘问题回答密码短语。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9740887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档