python运行bash命令得到错误的结果

时间:2011-05-10 00:14:26

标签: python bash cmd

您好我正在尝试在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

我错在哪里?

4 个答案:

答案 0 :(得分:3)

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

  

但是当我用bash运行这个印刷的cmd时......

子进程模块的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)

答案 1 :(得分:1)

您不需要使用echo传递数据。你可以直接使用python,即:

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

答案 2 :(得分:0)

来自the docs

  

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

这与你回来的元组匹配:

(b'713b2a82dc713ef273502c00787f9417\n', None)

要仅访问标准输出(stdoutdata),您需要该元组的元素0

print(event.communicate()[0])

答案 3 :(得分:0)

这样可以解决问题:

>>> p=Popen('echo -n \x61 |md5sum',shell=True,stdout=PIPE)
>>> p.communicate()
(b'0cc175b9c0f1b6a831c399e269772661  -\n', None)