将包含nullbyte(\ x00)的参数传递给subprocess.call

时间:2016-08-27 18:32:36

标签: linux python-2.7 subprocess rhel

#!/usr/bin/env python
from subprocess import call

try:
    call(['echo', "aabbccddee".decode('hex')])
    print 'Input without \\x00 works!'
except Exception as e:
    print 'Input without \\x00 throws exception: ' + str(e)

try:
    call(['echo', "aabbccdd00ee".decode('hex')]) # The input contains \x00
    print 'Input with \\x00 works!'
except Exception as e:
    print 'Input with \\x00 throws exception: ' + str(e)

返回以下内容(在RHEL 6上使用Python 2.7进行测试):

▒▒▒▒▒
Input without \x00 works!
Input with \x00 throws exception: execv() arg 2 must contain only strings

问题:

  • 这是subprocess.call的预期行为,还是这可能是个错误?
  • 有没有办法可以将包含\ x00的二进制数据(直接)传递给python脚本中的另一个可执行文件? 它可能会使用shell = True,但我更喜欢其他方式,如果有的话。

注意:

  • >>> type("00".decode('hex')) <type 'str'>

  • 直接运行echo $'\x00'可以正常工作。

修改

经过更多研究后,这似乎是正确的行为。 Due to the execve(2) semantics it is not possible to pass a string containing a null byte as argument.

请参阅:

  • $ echo $'\x55\x55\x55\x00\x55\x55' UUU

然而,我真的找不到这方面的信息了(特别是第二个问题,因为看起来shell = True也无济于事(空字节后的所有数据都不会传递))。我暂时搁置这个问题,也许有人可以提供更深入的见解或分享一些有用的资源。

0 个答案:

没有答案