【问题标题】:Running OpenSSL System Call运行 OpenSSL 系统调用
【发布时间】:2014-02-20 07:21:42
【问题描述】:

Python 新手,无法使其正常工作。我需要生成一个 openSSL 进程。这是我所拥有的:

from subprocess import call

cmd = "openssl aes-128-cbc -d -in ciphertext -base64 -pass pass:test123"
decrypted = call(cmd)
print (decrypted)

这甚至不会编译。我得到TypeError: 'function' object is not subscriptable

谁能告诉我如何做到这一点?谢谢。

顺便说一句,当我在终端中输入我的 cmd 字符串时,它工作正常。

编辑:我将decrypted = call[cmd] 更改为decrypted = call(cmd)。当我这样做时,我会收到一系列错误:

Traceback (most recent call last):
..., line 14, in <module>
    plaintext = call(cmd)
  File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/subprocess.py", line 523, in call
    with Popen(*popenargs, **kwargs) as p:
  File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/subprocess.py", line 817, in __init__
    restore_signals, start_new_session)
  File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/subprocess.py", line 1441, in _execute_child
    raise child_exception_type(errno_num, err_msg)
FileNotFoundError: [Errno 2] No such file or directory: 'openssl aes-128-cbc -d -in test.enc -base64 -pass pass:hello'

【问题讨论】:

    标签: python


    【解决方案1】:

    你用括号代替方括号

    即:

    decrypted = call(cmd)
    

    更一般地,您使用括号将参数包装在 python(以及大多数其他主流语言)中的函数调用中。

    此外,默认情况下,调用将第一个参数视为要运行的可执行文件,不带任何参数。您要么也需要传递shell=True,要么将命令拆分为一个数组并传递它。

    decrypted = call(cmd, shell=True) #execute command with the shell
    # or
    decrypted = call(['openssl', 'aes-128-cbc', '-d', '-in', 'ciphertext', '-base64', '-pass', 'pass:test123'])
    

    一般来说后者是首选,因为它会为您处理转义,并且在不同的 shell 之间更便携。

    【讨论】:

    • 嗯,这是我尝试过的许多事情之一。然而,当我这样做时,我得到了FileNotFoundError: [Errno 2] No such file or directory: 'openssl aes-128-cbc -d -in ciphertext -base64 -pass pass:hello'。这不是我试图作为参数传递的文件,而是命令行字符串。那里嵌入了一个文件(密文),但这似乎不是导致它出错的原因。
    • 看我的编辑,基本上,它试图使用整个命令字符串作为可执行文件的名称,显然没有这样的文件可以执行。
    • 就是这样。非常感谢。我实际上已经尝试过这样的事情,但无论我在做什么都行不通。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 2021-08-04
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    相关资源
    最近更新 更多