如何在Click框架中获取用户执行的原始未解析命令行字符串
Click获取用户执行原始命令的实现方法
你不需要等Click完成参数解析,也不用修改Click框架源码,用下面两种方法都能满足审计需求:
无侵入稳定方案:直接读取系统原始启动参数
Python进程启动时,用户传入的所有原始命令行参数会完整保存在标准库sys模块的argv列表中,和Click的解析逻辑完全无关,不会受参数默认值、类型转换、别名匹配等解析逻辑干扰,是审计场景下的最优选择。
直接在你的顶层命令回调中读取拼接即可:import sys import click @click.group() @click.option('--debug/--no-debug', default=False) @click.pass_context def cli(ctx, debug): # 直接拼接得到用户输入的原始命令字符串 raw_command = ' '.join(sys.argv) # 如果需要记录包含Python解释器路径的完整执行命令,用下面这行 # raw_command = f"{sys.executable} {' '.join(sys.argv)}" if debug: print(f"[审计日志] 原始执行命令: {raw_command}")该方案兼容所有Click版本,即使用PyInstaller等工具打包为独立可执行文件也能正常获取参数,不存在版本兼容问题。
Click上下文读取方案(不推荐生产使用)
Click在解析过程中会把未处理的原始参数存在上下文对象的args属性中,配合ctx.command_path可以拼出已匹配的命令路径,但该属性会随着子命令解析流程动态变化,且不会保留已经被匹配消费的选项参数,拿到的内容不完整;另外Click内部保留原始全量参数的protected_args属于非公开内部API,跨版本可能发生变动,审计场景下不建议使用。
注意:不要尝试通过Click解析后的参数对象反向拼接原始命令。Click解析过程中会自动填充参数默认值、做类型转换、处理选项别名,反向拼接出的内容和用户实际输入的原始命令存在差异,无法满足审计准确性要求。
内容的提问来源于stack exchange,提问作者Mini
相关产品推荐
相关产品推荐

