在Python的子进程上使用less-than(<)符号

时间:2018-01-29 14:23:20

标签: python subprocess popen

直接在控制台上我可以使用openssl加密和解密字符串。由于openssl需要一个输入文件,我可以告诉它从我输入的echo中使用less-than symbol(<)来获取它,如下所示:

加密:

# openssl enc -aes-256-cbc -in <(echo "helloworld") -a -k 12345678 -S 12345678 -iv 12345678
U2FsdGVkX18SNFZ4AAAAAKJTAirWf4KnDHYXlIF/87Y=

解密:

# openssl enc -aes-256-cbc -in <(echo "U2FsdGVkX18SNFZ4AAAAAKJTAirWf4KnDHYXlIF/87Y=") -d -a -k 12345678 -S 12345678 -iv 12345678
helloworld

使用Python我需要解密字符串“U2FsdGVkX18SNFZ4AAAAAKJTAirWf4KnDHYXlIF / 87Y =”并打印出“helloworld”。

到目前为止,我已经尝试了这个,但我总是遇到错误:

from subprocess import Popen, PIPE
cmd = 'openssl enc -aes-256-cbc -in < (echo U2FsdGVkX18SNFZ4AAAAAKJTAirWf4KnDHYXlIF/87Y=) ' \
      '-d -a -k 12345678 -S 12345678 -iv 12345678'
x = Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output = x.communicate()[0]
print output

我得到的错误是:/ bin / sh:1:语法错误:“(”意外

有没有办法达到我的需要?

3 个答案:

答案 0 :(得分:2)

$ openssl enc --help
...
 -in file           Input file to read from (default stdin)

默认情况下,该命令从stdin读取,如果您希望-in从文件而不是管道读取,则只需要openssl参数。即,默认情况下,这样做也会很好:

echo helloworld | openssl enc ...
# (no -in!)

Python的等价物是:

x = Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output = x.communicate(input='helloworld')[0]

(同样,-in中没有cmd,让opensslstdin读取。)

答案 1 :(得分:2)

Python默认使用/bin/sh来执行您的命令,但sh不支持<(...)构造。您需要use another shell(例如bash),而是使用Popen的{​​{1}}参数:

executable

(那就是说,我会考虑使用更加pythonic的提供输入的方法来探索deceze's suggestion。)

答案 2 :(得分:-1)

您是否直接在shell中测试了该命令以查看它是否有效?

最后,似乎没有什么能阻止你分开这些电话。

您可以echo U2FsdGVkX18SNFZ4AAAAAKJTAirWf4KnDHYXlIF/87Y并将其传递给stdin=subprocess.PIPE来自其他子进程,其中包含openssl命令。