#!/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
的预期行为,还是这可能是个错误?注意:
>>> 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也无济于事(空字节后的所有数据都不会传递))。我暂时搁置这个问题,也许有人可以提供更深入的见解或分享一些有用的资源。