python 运行 bash 命令得到不好的结果
你好,我正在尝试在 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' | echo -n -e '\x61' | md5
(b'713b2a82dc713ef273502c00787f9417\n',无)
但是当我在 bash 中运行这个打印的 cmd 时,我得到了不同的结果:
0cc175b9c0f1b6a831c399e269772661
我哪里出错了?
Hi I'm trying to run this bash cmd on python 3.2. Here is the python code:
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())
this gave me next result:
echo -n -e '\x61' | md5
(b'713b2a82dc713ef273502c00787f9417\n', None)
But when I run this printed cmd in bash, I get different result:
0cc175b9c0f1b6a831c399e269772661
Where I did mistake?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
这个问题的关键是当你说:
subprocess 模块的
Popen
函数不一定使用 bash,它可能使用其他一些 shell,例如/bin/sh
> 它不一定会以与 bash 相同的方式处理echo
命令。在我的系统上,在 bash 中运行命令会产生与您得到的结果相同的结果:但是如果我在
/bin/sh
中运行命令,我得到:这是因为
/bin/sh
> 在我的系统上不理解-e
选项,也不理解\x
转义序列。如果我在 python 中运行你的代码,我会得到与使用
/bin/sh
相同的结果:The key to this problem is when you say:
The
Popen
function of the subprocess module does not necessarily use bash, it may use some other shell such as/bin/sh
which will not necessarily handle theecho
command identically to bash. On my system running the command in bash produces the same result as you get:But if I run the command in
/bin/sh
I get:This is because
/bin/sh
on my system doesn't understand the-e
option nor does it understand the\x
escape sequence.If I run your code in python I get the same result as if I'd used
/bin/sh
:您不需要使用 echo 来传递数据。可以直接用python来做,即:
You dont need to use echo to pass data. You can do it directly with python, i.e.:
来自文档:
这与您返回的元组相匹配:
要仅访问标准输出 (
stdoutdata
),您需要该元组的元素0
:From the docs:
That matches up with the tuple you got back:
To access just the standard output (
stdoutdata
), you want element0
of that tuple:这可以解决问题:
This would do the trick: