嗨,我正在尝试在 python 3.2 上运行这个 bash cmd。这是python代码:

message = '\\x61'
shell_command = "echo -n -e '" + message + "' | md5"
print(shell_command)
event = Popen(shell_command, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT)
print(event.communicate())

这给了我下一个结果:
echo -n -e '\x61' | MD5
(b'713b2a82dc713ef273502c00787f9417\n', 无)

但是当我在 bash 中运行这个打印的 cmd 时,我得到了不同的结果:
0cc175b9c0f1b6a831c399e269772661

我哪里做错了?

最佳答案

这个问题的关键是当你说:



subprocess 模块的 Popen 函数不一定使用 bash,它可能会使用一些其他 shell,例如 /bin/sh,它不一定会像 bash 一样处理 echo 命令。在我的系统上,在 bash 中运行命令会产生与您相同的结果:

$ echo -n -e '\x61' | md5sum
0cc175b9c0f1b6a831c399e269772661  -

但是如果我在 /bin/sh 中运行命令,我会得到:
$ echo -n -e '\x61' | md5sum
20b5b5ca564e98e1fadc00ebdc82ed63  -

这是因为我系统上的 /bin/sh 不理解 -e 选项,也不理解 \x 转义序列。

如果我在 python 中运行您的代码,我会得到与使用 /bin/sh 相同的结果:
>>> cmd = "echo -n -e '\\x61' | md5sum"
>>> event = Popen(cmd, shell=True, stdout=PIPE, stderr=STDOUT)
>>> print event.communicate()
('20b5b5ca564e98e1fadc00ebdc82ed63  -\n', None)

关于python运行bash命令得到不好的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5943820/

10-16 20:45