2015-11-04 2 views
1

У меня много неприятностей, проходящей строку в инструмент OpenSSL командной строки с помощью подпроцесс питона так:питон подпроцесс с OpenSSL

process = subprocess.Popen(
    ["openssl", "rsa", "-in", pathFile, "-out", "id_rsa.out"], 
    stdin = subprocess.PIPE, 
    stdout = subprocess.PIPE, 
    stderr = subprocess.PIPE, 
    shell=False 
) 
try: 
    process.communicate("some passphrase\n", timeout=2) 
except: 
    process.kill() #openssl stays alive otherwise. 

Код выше по тайм-ауту (с и без перенаправления ИПП в Popen). Я могу использовать openssl обычно через терминал просто отлично, но мне действительно нужно иметь возможность запускать это как часть моего скрипта python.

Любая помощь будет оценена по достоинству.

+2

прочитал первую причину по: [? Почему бы просто не использовать трубу (POPEN())] (http://pexpect.readthedocs.org /en/stable/FAQ.html#whynotpipe). Найдите переключатель командной строки, который позволяет избежать передачи парольной фразы через tty или [использовать 'pexpect' или' pty.openpty() '] (http://stackoverflow.com/a/12471855/4279) – jfs

+0

Это хорошо читать. Благодарю. – DiscoStu

ответ

3

Раздел PASS PHRASE ARGUMENTS на the openssl man page объясняет, как работает механизм ввода кодовой фразы. Чтобы ваш пример работал, вы должны сообщить openssl взять фразу от stdin. Используя ваш пример в качестве отправной точки, следующие работы для меня:

process = subprocess.Popen(
    ["openssl", "rsa", "-in", pathFile, "-out", "id_rsa.out", "-passin", "stdin"], 
    stdin = subprocess.PIPE, 
    stdout = subprocess.PIPE, 
    stderr = subprocess.PIPE, 
    shell=False 
) 
process.communicate("passphrase\n") 
+0

Приветствия, спасибо. Это сработало. – DiscoStu

Смежные вопросы