用Python保存OpenSSL输出

2024-04-24 14:55:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将一个简单的OpenSSL命令的输出保存到Python中的一个变量中。你知道吗

$ openssl ciphers 'DEFAULT:!EXP:!LOW:!MEDIUM:!kDH:!kECDH:!DSS:!PSK:!SRP:!kRSA'
ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-CAMELLIA256-SHA:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-CAMELLIA128-SHA

在Python中,我使用来自subprocesscheck_output来捕获输出。你知道吗

from subprocess import check_output
out = check_output(["openssl", "ciphers 'DEFAULT:!EXP:!LOW:!MEDIUM:!kDH:!kECDH:!DSS:!PSK:!SRP:!kRSA'"])

这将导致:

openssl:Error: 'ciphers DEFAULT:!EXP:!LOW:!MEDIUM:!kDH:!kECDH:!DSS:!PSK:!SRP:!kRSA'' is an invalid command.

为了解决这个问题,我做了很多尝试。你知道吗

  • 转义(\'DEFAULT:!EXP:!LOW:!MEDIUM:!kDH:!kECDH:!DSS:!PSK:!SRP:!kRSA\')的单引号
  • 为上述字符串创建变量并在check_output中使用
  • check_outputcheck_output(["openssl", "ciphers", "..."])中分隔ciphers和上面的字符串

我的尝试都没有成功。你知道吗

如果我将ciphers和密码字符串分开,就会得到以下错误。你知道吗

out = check_output(["openssl", "ciphers", "'DEFAULT:!EXP:!LOW:!MEDIUM:!kDH:!kECDH:!DSS:!PSK:!SRP:!kRSA'"])
Error in cipher list
140348600368856:error:140E6118:SSL routines:SSL_CIPHER_PROCESS_RULESTR:invalid command:ssl_ciph.c:1226:
140348600368856:error:140E6118:SSL routines:SSL_CIPHER_PROCESS_RULESTR:invalid command:ssl_ciph.c:1226:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.5/subprocess.py", line 626, in check_output
    **kwargs).stdout
  File "/usr/lib/python3.5/subprocess.py", line 708, in run
    output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command '['openssl', 'ciphers', "'DEFAULT:!EXP:!LOW:!MEDIUM:!kDH:!kECDH:!DSS:!PSK:!SRP:!kRSA'"]' returned non-zero exit status 1

我不明白为什么在check_output中不能像在终端中执行时那样工作。你知道吗


编辑:我用PIPErun尝试了另一种方法:

>>> from subprocess import PIPE, run
>>> command = ["openssl", "ciphers", "'DEFAULT:!EXP:!LOW:!MEDIUM:!kDH:!kECDH:!DSS:!PSK:!SRP:!kRSA'"]
>>> result = run(command, stdout=PIPE, stderr=PIPE, universal_newlines=True)
>>> print(result.returncode, result.stdout, result.stderr)
1  Error in cipher list
140088420478680:error:140E6118:SSL routines:SSL_CIPHER_PROCESS_RULESTR:invalid command:ssl_ciph.c:1226:
140088420478680:error:140E6118:SSL routines:SSL_CIPHER_PROCESS_RULESTR:invalid command:ssl_ciph.c:1226:

这也会导致“无效命令”。你知道吗


Q: How can I capture the output of the mentioned OpenSSL command in Python3?


Tags: defaultssloutputcheckrsacommandaes256low
1条回答
网友
1楼 · 发布于 2024-04-24 14:55:13

你不必把密码表包装两次。你知道吗

试试这个

>>> import subprocess
>>> out = subprocess.check_output(['openssl', 'ciphers', 'DEFAULT:!EXP:!LOW:!MEDIUM:!kDH:!kECDH:!DSS:!PSK:!SRP:!kRSA'])
>>> out
b'DHE-RSA-AES256-SHA:EDH-RSA-DES-CBC3-SHA:DHE-RSA-AES128-SHA\n'

相关问题 更多 >