如何用 yq 的 system 操作符调用外部命令并正确启用安全开关 如何用 yq 的 system 操作符调用外部命令并正确启用安全开关【免费下载链接】yqyq is a portable command-line YAML, JSON, XML, CSV, TOML, HCL and properties processor项目地址: https://gitcode.com/GitHub_Trending/yq/yq在 yq 表达式中需要引用外部命令的输出时例如把某个命令的结果写进字段值可以使用system操作符。它被设计为默认关闭不显式传入--security-enable-system-operator时表达式会直接报错而不会执行任何命令。这篇文章基于 yq 官方文档 system-operators 说明如何正确启用这个开关、按文档语法调用命令以及启用后对其他安全开关产生的影响。system 操作符的默认状态禁用并报错system操作符的语法是system(命令; 参数)命令字符串必填参数可以是单个值也可以是参数数组用;与命令分隔可选。该操作符默认处于禁用状态。与--security-disable-env-ops、--security-disable-file-ops的行为一致禁用时不会运行命令而是直接返回错误。文档给出的禁用示例对sample.yml内容如下执行yq .country system(/usr/bin/echo; test) sample.ymlcountry: Australia会得到错误Error: system operations are disabled, use --security-enable-system-operator to enable看到这个报错就说明操作符处于禁用状态需要加上安全开关。启用安全开关并调用命令启用方式是给 yq 命令加上--security-enable-system-operator标志。带参数调用使用同一个sample.ymlcountry: Australiayq --security-enable-system-operator .country system(/usr/bin/echo; test) sample.yml文档示例输出country: test命令的标准输出去掉末尾换行被作为字符串赋给了.country字段。不带参数调用省略分号和参数即可不传额外参数。对内容为a: hello的文件执行yq --security-enable-system-operator .a system(/usr/bin/echo) sample.yml文档示例输出a: 即没有参数时echo无输出字段被赋为空字符串。传多个参数可选分支文档说明参数可以是一个数组。yq 的测试用例operator_system_test.go展示了数组写法对内容为a: hello的文件执行yq --security-enable-system-operator .a system(/usr/bin/echo; [foo, bar]) sample.yml测试中的预期结果为a: foo bar。数据流向节点值进 stdinstdout 出结果文档对数据流的定义是当前匹配节点的取值会被序列化后通过stdin传给外部命令命令的stdout去掉末尾换行作为字符串返回成为表达式中的值。因此外部命令内部可以用cat等方式读到 yq 传入的节点值再决定输出内容。文档给出的通用用法形式为yq --security-enable-system-operator --null-input .field system(command; arg1)其中command与arg1是占位写法需要替换为你实际要执行的命令和参数--null-input表示不读取输入文件直接求值表达式适合从零创建文档。启用 system 后对其他安全开关的影响文档给出了明确的安全警告启用system后它可以通过外部命令复现env和load操作符的功能。也就是说如果同时使用了--security-disable-env-ops禁用 env 相关操作和--security-disable-file-ops禁用 load 等文件相关操作启用system会实际抵消override这两个禁用开关的效果。在只读场景处理不受信任的表达式时这一点需要在安全边界上单独考虑即使已经禁用了 env 和 file 操作只要表达式中出现system且开关被打开就能借助外部命令间接读取环境或文件。结果核对方式按文档可以直接核对的三类结果开关未启用命令不执行输出固定错误信息Error: system operations are disabled, use --security-enable-system-operator to enable开关已启用、命令成功stdout去末尾换行被写入目标字段如country: test开关已启用、命令无参数输出字段被赋为空字符串如a: 。以上输出均为文档示例结果。完整实现可参考 operator_system.go标志--security-enable-system-operator在 root.go 中注册与另外两个安全标志并列。【免费下载链接】yqyq is a portable command-line YAML, JSON, XML, CSV, TOML, HCL and properties processor项目地址: https://gitcode.com/GitHub_Trending/yq/yq创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考