在学习 subprocess 模块的时候看到代码中有一行:
sys.audit("subprocess.Popen", executable, args, cwd, env)
才了解到 Python 3.8 中新加了这样一个审计功能。
- https://peps.python.org/pep-0578/
- https://www.python.org/downloads/release/python-380/
- https://docs.python.org/3/library/sys.html#sys.audit
作用
提供一种机制,对 Python 程序执行过程中的部分关键操作进行干预,比如记录事件、引发异常、中止操作或完全终止进程。
部分关键操作发生的时候,Python 会调用我们定义的钩子方法。
注意:官方提示,恶意代码可以轻易绕过这些钩子,不要指望审计钩子能用来创建一个安全的 sandbox。
注意:sys.addaudithook
方法的调用会触发一个同名的事件。如果现有的钩子方法抛出 Runtime 异常,则不会添加这个钩子。
支持的审计事件
CPython 定义了一些事件:Audit events table,比如:
import
exec
compile
os.exec
os.listdir
os.rmdir
os.spawn
os.walk
os.system
subprocess.Popen
使用
sys.audit
方法是官方定义和执行的,Python 运行时负责抛出审计事件,我们程序只管使用系统方法 sys.addaudithook(hook) 来添加审计钩子处理这些事件。
import sys
def hook(event, args):
print('%s: %r' % (event, args))
sys.addaudithook(hook)
import math
num = math.ceil(100 / 3)
print(num)