Linux下Python3管道输出时出现BrokenPipeError的解决求助
Python3 管道输出 BrokenPipeError 解决办法(Pwn挑战场景)
在Linux bash环境下做Pwn挑战时,用Python3生成输入通过管道传给目标程序:
python3 -c 'print(".....")' | ./someapp
会碰到如下报错:
Exception ignored in: <_io.TextIOWrapper name='
' mode='w' encoding='utf-8'>
BrokenPipeError: [Errno 32] Broken pipe
而用Python2执行相同逻辑则不会报错,以下是几种解决办法:
快速屏蔽错误(适合测试)
直接把Python的标准错误输出重定向到/dev/null,临时消除报错:python3 -c 'print(".....")' 2>/dev/null | ./someapp注意:这会屏蔽所有错误输出,可能错过其他潜在问题。
代码内捕获异常(规范做法)
修改Python代码,主动处理管道断开的异常,避免报错信息输出:python3 -c 'import sys; try: print("....."); sys.stdout.flush(); except BrokenPipeError: sys.exit(0)' | ./someapp加
sys.stdout.flush()是强制立刻输出内容,避免缓冲导致的管道问题。强制无缓冲输出(辅助手段)
用stdbuf工具让Python输出不缓冲,配合上面的方法使用:stdbuf -o0 python3 -c 'import sys; try: print("....."); except BrokenPipeError: sys.exit(0)' | ./someapp
为什么Python2没这个问题?
Python2默认会忽略管道断开的BrokenPipeError,不会抛出异常;而Python3从3.3版本开始,会将该异常暴露出来,所以才会出现差异。
内容的提问来源于stack exchange,提问作者yehudahs
相关产品推荐
相关产品推荐

