【问题标题】:Save OpenSSL output in Python在 Python 中保存 OpenSSL 输出
【发布时间】:2017-07-19 08:20:12
【问题描述】:

我正在尝试将简单 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中使用
  • cipherscheck_output中的上述字符串分开(check_output(["openssl", "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:

这也会导致“无效命令”。


问:如何在 Python3 中捕获上述 OpenSSL 命令的输出?

【问题讨论】:

    标签: python python-3.x openssl output


    【解决方案1】:

    您不必将密码列表包装两次。

    试试这个,

    >>> 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'
    

    【讨论】:

    • 太棒了!我只是想自己添加一个解决方案,但你的更优雅。我用runshell=True。谢谢!
    • @SaAtomic 很高兴它有帮助。
    猜你喜欢
    • 2015-12-28
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多