命令规则
用可测试的前缀规则控制命令执行决定。
创建规则文件
.rules 文件使用 Starlark 表达命令前缀与决定。规则用于匹配命令参数,不能代替沙盒、管理员策略或外部操作授权。创建后先运行检查命令验证匹配范围。
python
prefix_rule(
pattern = ["gh", "pr", "view"],
decision = "prompt",
justification = "查看远程 PR 前核对目标",
match = ["gh pr view 42"],
not_match = ["gh pr --repo team/repo view 42"],
)了解规则字段
| 字段 | 规则 |
|---|---|
| pattern | 非空参数前缀;每项为字符串或一组可选字符串 |
| decision | allow、prompt 或 forbidden;多条匹配采用最严格结果 |
| justification | 非空说明,帮助理解审批或拒绝原因 |
| match / not_match | 加载时校验的命令示例 |
匹配按 argv 的位置进行。参数出现在其他位置不保证命中;宽泛的 shell 或可执行文件前缀可能允许超出预期的操作。
Shell 包装与复合命令
安全规则需要检查实际命令,而不只看 bash -lc 或 zsh -c。由普通词项和安全连接运算符组成的脚本可拆分后逐条判断,再采用最严格结果。
变量展开、重定向、命令替换、通配符和控制流会改变语义;无法安全拆分时保守检查整个调用。允许 git status 不能自动允许同一脚本中的删除或上传命令。
测试规则
bash
lime execpolicy check --pretty \
--rules /absolute/path/default.rules \
-- gh pr view 42 --json title,body检查 JSON 结果中的决定、全部命中规则与说明。可以重复传 --rules 组合文件。为规则补充正例、位置变化、额外参数和复合命令等反例,再决定是否加载或扩大范围。
规则语言与信任
Starlark 类似 Python,但规则求值不应借此获得文件系统等副作用。工具运行时是否加载某个文件,仍取决于现役配置层、项目可信状态与系统要求;仅文件存在或检查通过不代表执行已经获准。