2011-05-10 70 views
3

嗨我想在python 3.2上运行这个bash cmd。下面是Python代码:蟒蛇运行bash命令得到错误结果

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()) 

这给了我一个结果:
回声-n -e'\ x61的| MD5
(b'713b2a82dc713ef273502c00787f9417 \ N”,无)

但是当我运行在bash这个印刷CMD,我得到不同的结果:
0cc175b9c0f1b6a831c399e269772661

如果我做了错误?

+0

好奇,它在Python 2.5对我的作品(即返回0cc175b9c0f1b6a831c399e269772661) – 2011-05-10 00:37:50

+0

但是,如果你真的wnat是MD5哈希值,只需使用hashlib模块(和它的md5函数)。 – Keith 2011-05-10 02:09:33

回答

3

的关键对此问题是当你说:

但是,当我运行在bash这个印刷CMD ...

的子模块的Popen功能不一定使用bash,它可以使用一些其他的壳如/bin/sh这不一定相同处理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) 
0

the docs

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

与你回来的元组相匹配:

(b'713b2a82dc713ef273502c00787f9417\n', None) 

要访问只是标准输出(stdoutdata),你想要的元组的元素0

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

这会做的伎俩:

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

你不需要使用回声传递数据。您可以直接与蟒蛇做,即:

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