Python运行bash命令获得错误结果

3 投票
4 回答
829 浏览
提问于 2025-04-16 17:19

你好,我正在尝试在Python 3.2中运行这个bash命令。以下是我的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', None)

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

我哪里出错了?

4 个回答

0

来自文档

communicate()会返回一个元组 (stdoutdata, stderrdata)

这和你得到的元组是一样的:

(b'713b2a82dc713ef273502c00787f9417\n', None)

如果你只想获取标准输出(stdoutdata),你需要取这个元组的第一个元素,也就是0

print(event.communicate()[0])
1

你不需要用echo来传递数据。你可以直接用Python来做到这一点,也就是说:

Popen('/usr/bin/md5sum', shell=False, stdin=PIPE).communicate('\x61')
3

这个问题的关键在于你说的:

但是当我在bash中运行这个打印的命令时……

这里的 Popen 函数来自于 subprocess 模块,它不一定会使用 bash,可能会用其他的命令行工具,比如 /bin/sh。而 /bin/sh 处理 echo 命令的方式不一定和 bash 一样。在我的系统上,使用 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)

撰写回答