python 运行 bash 命令得到不好的结果

发布于 2024-11-06 05:41:44 字数 523 浏览 1 评论 0原文

你好,我正在尝试在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

流殇 2024-11-13 05:41:44

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

但是当我在 bash 中运行这个打印的 cmd 时...

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)

The key to this problem is when you say:

But when I run this printed cmd in bash...

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 the echo command identically to bash. On my system running the command in bash produces the same result as you get:

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

But if I run the command in /bin/sh I get:

$ echo -n -e '\x61' | md5sum
20b5b5ca564e98e1fadc00ebdc82ed63  -

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:

>>> cmd = "echo -n -e '\\x61' | md5sum"
>>> event = Popen(cmd, shell=True, stdout=PIPE, stderr=STDOUT)
>>> print event.communicate()
('20b5b5ca564e98e1fadc00ebdc82ed63  -\n', None)
赢得她心 2024-11-13 05:41:44

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

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

You dont need to use echo to pass data. You can do it directly with python, i.e.:

Popen('/usr/bin/md5sum', shell=False, stdin=PIPE).communicate('\x61')
情深如许 2024-11-13 05:41:44

来自文档

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

这与您返回的元组相匹配:

(b'713b2a82dc713ef273502c00787f9417\n', None)

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

print(event.communicate()[0])

From the docs:

communicate() returns a tuple (stdoutdata, stderrdata).

That matches up with the tuple you got back:

(b'713b2a82dc713ef273502c00787f9417\n', None)

To access just the standard output (stdoutdata), you want element 0 of that tuple:

print(event.communicate()[0])
寄居人 2024-11-13 05:41:44

这可以解决问题:

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

This would do the trick:

>>> p=Popen('echo -n \x61 |md5sum',shell=True,stdout=PIPE)
>>> p.communicate()
(b'0cc175b9c0f1b6a831c399e269772661  -\n', None)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文