Python调用需交互的openssl genrsa命令失败,求无交互实现方案
解决Python调用OpenSSL自动输入密码的问题
我帮你分析下问题所在,以及怎么修复:
首先你的代码里有两个关键问题导致失败:
- 变量拼写错误:你定义的是
inputdata,但调用communicate时写成了inputata,这会直接抛出NameError,进程根本没法正确接收输入。 - 密码输入次数与
communicate()的使用方式不匹配:在Shell里执行openssl genrsa -aes256时,会要求输入两次密码(设置密码+验证密码),但你两次调用communicate()——要知道communicate()只能调用一次,第一次调用后会关闭进程的输入流,第二次调用完全无效。
修正后的代码
把两次密码(每次后跟换行符)合并成一个字符串,一次性传给communicate(),同时修正拼写错误,还要记得捕获stderr方便调试:
import subprocess # 启动openssl进程,捕获stdin、stdout和stderr p = subprocess.Popen( ["openssl", "genrsa", "-aes256", "-out", "ise.key.pem", "2048"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) # 构造输入:两次密码,每个后面加换行符模拟回车 input_content = "123456\n123456\n" # 一次性发送输入,等待进程结束并获取输出 stdout_output, stderr_output = p.communicate(input=input_content) # 可选:打印输出信息用于调试 print("标准输出:", stdout_output.decode()) print("错误输出:", stderr_output.decode())
为什么这样能解决问题?
- 修正拼写错误:把
inputata改成正确的变量名,确保输入内容能被进程接收。 - 一次性传递两次密码:OpenSSL需要两次密码输入,我们把两个密码用换行符分隔,一次性传给进程,模拟用户两次输入回车的动作。
- 正确使用
communicate():这个方法会处理进程的输入/输出流,发送所有输入后等待进程终止,避免多次调用导致的流关闭问题。 - 捕获stderr:你之前看到的错误信息其实是OpenSSL输出到标准错误的内容,捕获它可以帮你更快定位问题。
如果你不想看到OpenSSL的生成日志,可以把stdout和stderr设置为subprocess.DEVNULL,但调试阶段建议保留捕获功能。
内容的提问来源于stack exchange,提问作者Pankaj Sheoran
相关产品推荐
相关产品推荐

