以optee的sign_encrypt.py为例讲解argparse命令解析模块

这篇具有很好参考价值的文章主要介绍了以optee的sign_encrypt.py为例讲解argparse命令解析模块。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Argparse是 Python 标准库中推荐的命令行解析模块。该模块会自动生成提示信息,且在用户给程序传入非法参数时报错。

刚好最近在看optee的sign_encrypt.py,以它为例介绍python的argparse命令解析模块。

脚本参见:optee_os/scripts/sign_encrypt.py at master · OP-TEE/optee_os · GitHub

 一、一些基本用法使用示例

1、创建ArgumentParser解析器对象

parser = argparse.ArgumentParser(
        description='Sign and encrypt (optional) a Trusted Application ' +
        ' for OP-TEE.',
        usage='%(prog)s <command> ...',
        epilog='<command> -h for detailed help')

ArgumentParser 对象的参数有:

prog -- 程序的名称(默认:sys.argv[0])
usage -- 描述程序用途的字符串(默认值:从添加到解析器的参数生成)
description -- 在参数帮助文档之前显示的文本(默认值:无)。这个参数简要描述这个程序做什么以及怎么做。
epilog -- 在参数帮助文档之后显示的文本(默认值:无)
parents -- 一个 ArgumentParser 对象的列表,它们的参数也应包含在内
formatter_class -- 用于自定义帮助文档输出格式的类
prefix_chars -- 可选参数的前缀字符集合(默认值:’-’)
fromfile_prefix_chars -- 当需要从文件中读取其他参数时,用于标识文件名的前缀字符集合(默认值:None)
argument_default -- 参数的全局默认值(默认值: None)
conflict_handler -- 解决冲突选项的策略(通常是不必要的)
add_help -- 为解析器添加一个 -h/--help 选项(默认值: True)
allow_abbrev -- 如果缩写是无歧义的,则允许缩写长选项 (默认值:True)

exit_on_error -- 确定发生错误时 ArgumentParser 是否退出并显示错误信息

2、调用add_argument() 方法添加参数

添加参数是由add_argument() 方法完成的,它指定 ArgumentParser对象如何获取命令行字符串并将其转换为对象。这些信息将会在 parse_args() 调用时被存储和使用。例如:

    def arg_add_uuid(parser):
        parser.add_argument(
            '--uuid', required=True, type=uuid_parse,
            help='String UUID of the TA')

    def arg_add_key(parser):
        parser.add_argument(
            '--key', required=True, help='''
                Name of signing and verification key file (PEM format) or an
                Amazon Resource Name (arn:) of an AWS KMS asymmetric key.
                At least public key for the commands digest, stitch, and
                verify, else a private key''')

    def arg_add_enc_key(parser):
        parser.add_argument(
            '--enc-key', required=False, help='Encryption key string')

    def arg_add_enc_key_type(parser):
        parser.add_argument(
            '--enc-key-type', required=False,
            default='SHDR_ENC_KEY_DEV_SPECIFIC',
            choices=list(enc_key_type.keys()), help='''
                Encryption key type,
                Defaults to SHDR_ENC_KEY_DEV_SPECIFIC.''')

    def arg_add_ta_version(parser):
        parser.add_argument(
            '--ta-version', required=False, type=int_parse, default=0, help='''
                TA version stored as a 32-bit unsigned integer and used for
                rollback protection of TA install in the secure database.
                Defaults to 0.''')

    def arg_add_sig(parser):
        parser.add_argument(
            '--sig', required=True, dest='sigf',
            help='Name of signature input file, defaults to <UUID>.sig')

    def arg_add_dig(parser):
        parser.add_argument(
            '--dig', required=True, dest='digf',
            help='Name of digest output file, defaults to <UUID>.dig')

    def arg_add_in(parser):
        parser.add_argument(
            '--in', required=False, dest='inf', help='''
                Name of application input file, defaults to
                <UUID>.stripped.elf''')

    def arg_add_out(parser):
        parser.add_argument(
            '--out', required=True, dest='outf',
            help='Name of application output file, defaults to <UUID>.ta')

    def arg_add_algo(parser):
        parser.add_argument(
            '--algo', required=False, choices=list(sig_tee_alg.keys()),
            default='TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256', help='''
                The hash and signature algorithm.
                Defaults to TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256.''')

    def arg_add_subkey(parser):
        parser.add_argument(
            '--subkey', action=OnlyOne, help='Name of subkey input file')

    def arg_add_name(parser):
        parser.add_argument('--name',
                            help='Input name for subspace of a subkey')

    def arg_add_subkey_uuid_in(parser):
        parser.add_argument(
            '--in', required=True, dest='inf',
            help='Name of subkey input file')

    def arg_add_max_depth(parser):
        parser.add_argument(
            '--max-depth', required=False, type=int_parse, help='''
            Max depth of subkeys below this subkey''')

    def arg_add_name_size(parser):
        parser.add_argument(
            '--name-size', required=True, type=int_parse, help='''
            Size of (unsigned) input name for subspace of a subkey.
            Set to 0 to create an identity subkey (a subkey having
            the same UUID as the next subkey or TA)''')

    def arg_add_subkey_version(parser):
        parser.add_argument(
            '--subkey-version', required=False, type=int_parse, default=0,
            help='Subkey version used for rollback protection')

    def arg_add_subkey_in(parser):
        parser.add_argument(
            '--in', required=True, dest='inf', help='''
            Name of PEM file with the public key of the new subkey''')

    def arg_add_subkey_out(parser):
        parser.add_argument(
            '--out', required=True, dest='outf',
            help='Name of subkey output file')

3、使用 parse_args() 解析添加的参数

parse_args() 方法检查命令行,把每个参数转换为适当的类型然后调用相应的操作。

parsed = parser.parse_args(argv)

if parsed.command is None:
     parser.print_help()
     sys.exit(1)

4、使用add_subparsers()方法去创建子命令

功能比较多的命令端程序常常将功能分解到不同子命令中。

subparsers = parser.add_subparsers(
            title='valid commands, with possible aliases in ()',
            dest='command', metavar='')

 5、使用add_parser添加子命令

parser_sign_enc = subparsers.add_parser(
        'sign-enc', prog=parser.prog + ' sign-enc',
        help='Generate signed and optionally encrypted loadable TA image file')

arg_add_uuid(parser_sign_enc)
arg_add_ta_version(parser_sign_enc)
arg_add_in(parser_sign_enc)
arg_add_out(parser_sign_enc)
arg_add_key(parser_sign_enc)
arg_add_subkey(parser_sign_enc)
arg_add_name(parser_sign_enc)
arg_add_enc_key(parser_sign_enc)
arg_add_enc_key_type(parser_sign_enc)
arg_add_algo(parser_sign_enc)

6、使用set_defaults()绑定子命令默认函数

argparse提供了一个一个方法set_defaults(),可以将子命令绑定特定的函数。

parser_sign_enc.set_defaults(func=command_sign_enc)

综上,sign_encrypt.py脚本有以下7个子命令,对应7个功能点:

sign-enc、digest、stitch、verify、display、subkey_uuid、sign_subkey

即:

$python3 sign_encrypt.py -h
usage: sign_encrypt.py <command> ...

Sign and encrypt (optional) a Trusted Application for OP-TEE.

options:
  -h, --help            show this help message and exit

valid commands, with possible aliases in ():

    sign-enc            Generate signed and optionally encrypted loadable TA image file
    digest (generate-digest)
                        Generate loadable TA binary image digest for offline signing
    stitch (stitch-ta)  Generate loadable signed and encrypted TA binary image file from TA raw image and its signature
    verify              Verify signed TA binary
    display             Parses and displays a signed TA binary
    subkey-uuid         calculate the UUID of next TA or subkey
    sign-subkey         Sign a subkey

<command> -h for detailed help

二、参考资料

Argparse 教程 — Python 3.11.4 文档文章来源地址https://www.toymoban.com/news/detail-499795.html

到了这里,关于以optee的sign_encrypt.py为例讲解argparse命令解析模块的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【python】程序运行添加命令行参数argparse模块用法详解

     很多时候,我们的程序要带参数来运行不同的功能,需要解析命令行参数。argparse模块能够很好的提供支持。 argparse是 python 自带的命令行参数解析包,用于解析命令行参数的标准模块。可以让人轻松编写用户友好的命令行接口,还会自动生成帮助和使用手册,并在用户给程

    2024年02月04日
    浏览(38)
  • 常用python代码大全-python使用argparse模块处理命令行参数

    argparse 是 Python 的一个标准库模块,用于从命令行解析参数。这个模块使编写用户友好的命令行接口变得更加简单。下面是一个使用 argparse 模块处理命令行参数的示例代码: 在这个示例中,我们首先导入了 argparse 模块。然后,我们创建了一个 ArgumentParser 对象,它代表我们的

    2024年02月01日
    浏览(31)
  • py的函数讲解

    前言:本章节我们来讲函数,主播略微感觉到有点小难,友友们需要认真看 目录 一.初始函数 1.1关于函数 1.2举例 1.3小结 二.函数的基础语法 2.1关于函数的语法 2.2举例 2.3小结 三.函数的参数 3.1关于函数的参数 3.2举例 3.3小结 四.函数的返回值定义语法 4.1关于函数返回值的定义

    2024年01月22日
    浏览(32)
  • 以SQLserver为例的Dapper详细讲解

    Dapper是一种轻量级的ORM(对象关系映射)工具,它提供了高效且易于使用的方式来执行数据库操作。 Dapper是由Stack Overflow团队开发并维护的,它的主要目标是提供比EF更快、更直接的方式访问数据库。 Dapper的主要特点包括: 基于纯ADO.NET而不是EF,因此性能更高 支持多种数据

    2023年04月24日
    浏览(36)
  • 【Yolov5】保姆级别源码讲解之-推理部分detect.py文件

    克隆一下yolov5的代码 配置好项目所需的依赖包 opt 为执行可以传递的参数 具体的参数如图所示,比较重要的参数 weights权重文件、–source 数据集合 – data 数据集的配置 weights 权重文件 – source 为需要推理的原图 data参数 数据配置 imgsz 参数是训练配置图片的大小 device 设备信

    2024年02月08日
    浏览(29)
  • 详细讲解MySQL在Linux中的部署(Centos为例)

    本篇文章详解Mysql在Linux中的部署,以便于能够在SQLyog中远程连接MySQL服务,具体步骤如下所示: 1.查找并卸载mariadb 由于Centos7中自带mariadb,而mariadb是MySQL的一个分支,因此,按照MySQL前必须卸载mariadb,具体命令如下所示: 如下所示: 最终使用rpm -qa|grep mariadb命令发现没有内容

    2024年02月16日
    浏览(28)
  • STM32定时中断具体配置讲解(定时1s触发中断为例)(有待更新)

            这里介绍一下STM32定时中断。         有时候我们需要用到定时或者计数功能,这时候就需要用到定时器了,通俗地讲就是我们可以通过调节它的本身主频率来得到我们需要的频率大小,进而设定时间,也可以配置外部计数的模式使用外部计数。         这里以

    2024年02月04日
    浏览(50)
  • MAC修改python3命令为py

    alias py=“/usr/bin/python3”

    2024年02月10日
    浏览(36)
  • Python进行文本处理分析与词云生成——以三国演义为例(含代码讲解)

             在Python中处理文本数据是一种常见的任务,这需要使用到多种字符串操作和数据结构。本文将详细解读如何调用jieba、wordcloud以及 matplotlib这些库进行文本处理分析与词云制作。          在我们导入所需要的库之前我们需要先在pycharm中下载并安装库,步骤如下:

    2024年02月04日
    浏览(26)
  • OPTEE之sonarlint静态代码分析实战一——optee_os ATF(TF-A)/OPTEE之静态代码分析汇总

    安全之安全(security²)博客目录导读  ATF(TF-A)/OPTEE之静态代码分析汇总 目录 一、OPTEE源码下载及分析 二、扫描类型归类 三、sonarlint配置make参数

    2024年02月16日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包