контроль 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 pipe не может быть убит
  • Непостоянное поведение Python-Subprocess-Popen в многопоточной среде
  • Popen с конфликтующим исполняемым файлом / path
  • Специальные символы python popen, не обрабатывающие файл
  • Python: оптимизация изображений в памяти (StringIO & POpen с помощью jpegoptim)
  • Сохранение трубы в процессе открытия
  • Как открыть файл на Mac OSX 10.8.2 в python
  • Чтение / запись подпроцесса Popen ()
  • Python - лучший язык программирования в мире.