Python 子进程,如何将原始十六进制数据传递到命令行?

Python Subprocess, how can I pass raw hex data to command line?

我有一个命令cat hash.bin | openssl pkeyutl -sign -inkey privk.pem可以正确得到结果。

现在我想用 python subprocess 来做,我这样做(其中 hash 是从 hash.bin 读取的)

cmd = ['openssl', 'pkeyutl', '-sign', '-inkey ', prvk]
p = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=STDOUT)
out = p.communicate(input=hash)[0]
print(out)

但是 openssl 失败了。

我无法使用 -in-out 因为我的代码无法访问硬盘..

问题是由 inkey 命令后的 space 字符引起的。

尝试删除 space 应该可以:

cmd = ['openssl', 'pkeyutl', '-sign', '-inkey', prvk]

原因是 Popen() 通过 space 字符作为 -inkey 选项标记的一部分。 openssl 决定不存在名为 -inkey 的选项(带有 space),因此它退出。就像您从命令行执行此操作一样:

cat hash.bin | openssl pkeyutl -sign '-inkey ' privk.pem

失败了。