【问题标题】:controlling puttygen with Popen用 Popen 控制 puttygen
【发布时间】: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()

【问题讨论】:

    标签: python popen


    【解决方案1】:

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

    time.sleep(0.1) 
    

    之间

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2018-06-29
        • 2020-08-14
        • 2011-10-27
        • 1970-01-01
        • 2012-05-25
        • 2013-08-07
        • 1970-01-01
        • 2012-03-09
        • 1970-01-01
        相关资源
        最近更新 更多