контроль puttygen с Popen

Я пишу скрипт python для генерации SSH-ключей для пользователей. После генерации их с помощью ssh-keygen я хотел бы использовать puttygen для создания файла .ppk. К сожалению, puttygen не позволяет использовать кодовую фразу в командной строке – поэтому я пытаюсь подключить их к своему 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() 

2 Solutions collect form web for “контроль puttygen с Popen”

Кажется, что puttygen читает все три фразы как первый. Самое простое решение – вставить

 time.sleep(0.1) 

между

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

puttygen (0,69 в моем случае) имеет новые опции: '–old-passphrase file' – указать файл, содержащий старую ключевую кодовую фразу, '–new-passphrase file' – указать файл, содержащий новую ключевую фразу. Он отвечает на кодовую фразу посредством проблемы «stdin».

  • Используя подпроцесс Python и Popen в одном скрипте для запуска другого скрипта Python, который требует взаимодействия с пользователем (по raw_input)
  • subprocess.Popen () имеет непоследовательное поведение между Eclipse / PyCharm и выполнением терминала
  • subprocess.Popen с использованием относительных путей
  • Subprocess.Popen: клонирование stdout и stderr как для терминала, так и для переменных
  • Подпроцесс Python на Windows 7 64 бит - нет вывода, когда stdout = PIPE
  • Возвращает ли значение Popen () .stdout.close ()?
  • PIPON PIPE для всплытия stdin
  • subprocess.Popen.stdout - чтение stdout в режиме реального времени (снова)
  • Как получить PID через subprocess.Popen с пользовательской переменной среды?
  • Чтение / запись файлов из hdfs с использованием python с подпроцессом, Pipe, Popen дает ошибку
  • Возможно ли запустить функцию в подпроцессе без потоковой обработки или записи отдельного файла / скрипта
  • Python - лучший язык программирования в мире.