运行OpenSSL系统调用

时间:2014-02-20 07:21:43

标签: python

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'

1 个答案:

答案 0 :(得分:3)

你使用paranthesis而不是方括号

即:

decrypted = call(cmd)

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

此外,默认情况下,call将第一个参数视为要运行的可执行文件,不带任何参数。您还需要传递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'])

一般情况下,后者是首选,因为它会为你逃避,并且在不同的贝壳之间更容易携带。