我试图从Python脚本运行openssl命令,但是从脚本中执行的命令和直接在终端中执行的命令获取不同的sha1值。
这是我的代码:
command = "echo -n '" + hex(key)[2:] + "' | openssl sha1"
print(command)
os.system(command)
output = subprocess.check_output(command, shell=True)
# This converts the bytes object to a string.
output = output.decode("utf-8")
print(output)
os.system(command)
仅用于检查此方法和subprocess.check_output()
是否给出相同的结果。
以下是key=0xabc
的示例输入的程序输出:
echo -n 'abc' | openssl sha1
(stdin)= 9d4fe92b8bdc894f5838fad83108bf3841b257fa
(stdin)= 9d4fe92b8bdc894f5838fad83108bf3841b257fa
第一行是要执行的命令,第二行是使用os.system()的命令的结果,第三行是使用subprocess.check_output()的命令的结果。如您所见,这两种方法给出的结果相同。
现在,如果我复制并粘贴此处显示的命令并在终端中执行该命令,则结果如下:
(stdin)= a9993e364706816aba3e25717850c26c9cd0d89d
即使我复制并粘贴了完全相同的命令,但哈希值输出还是不同的。
即使是陌生人,如果我从-n
中省略了echo
选项,也不会出现不一致的情况:
echo 'abc' | openssl sha1
(stdin)= 03cfd743661f07975fa2f1220c5194cbaff48451
(stdin)= 03cfd743661f07975fa2f1220c5194cbaff48451
在终端机中:
(stdin)= 03cfd743661f07975fa2f1220c5194cbaff48451
我在网上阅读的所有有关类似问题的信息都源于未使用-n
,而不是看似引起问题的-n
。对于我正在执行的特定任务,我必须使用-n
,因为我正在计算使用echo -n "hash_value" | openssl sha1
计算的哈希值的前映像。
任何帮助将不胜感激:)
答案 0 :(得分:2)
TL; DR :使用/bin/echo
说明:
python系统命令可能使用/bin/sh
的默认外壳程序,该外壳程序通常链接到POSIX兼容外壳程序,而终端会话使用的是用户的登录外壳程序,很可能是bash
。 POSIX Shell标准不支持内置功能-n
的{{1}}选项。这意味着您实际上是在计算“ -n abc”的摘要。您可以像这样重现bash:
echo
二进制可执行文件仍然可用,但是需要使用完整路径来调用,因为内置的Shell会覆盖它。代替echo "-n abc" | openssl sha1
9d4fe92b8bdc894f5838fad83108bf3841b257fa
,使用echo
。