直接在终端里跑 shell 命令真的太容易翻车了
我最近在看一个很有意思的思路,它不是靠简单的正则匹配来检查命令,而是通过 AST(抽象语法树)解析来做自动化审查。这种方法的逻辑非常硬核:它把你的 shell 命令先拆解成树状结构,这样它就能精准地识别出你到底是在执行一个简单的
ls,还是在调用一个带有危险参数的复杂逻辑。配合这个解析引擎的,还有一个专门负责审计的 Subagent。整个工作流大概是这样的:
核心实现逻辑
1. 语法树解析 (AST Parsing):
当你在终端输入或通过脚本生成命令时,系统首先通过解析器将字符串转换成 AST。这比单纯的字符串搜索要靠谱得多。比如 rm -rf /tmp/test 和 echo "rm -rf /tmp/test",在正则眼里可能都有危险字符,但在 AST 眼里,前者是执行指令,后者仅仅是一个字符串常量。
2. Subagent 风险评估:
解析出来的结构化数据会被喂给一个专门的审查 Agent。这个 Agent 的职责不是写代码,而是“找茬”。它会根据预设的安全策略,分析当前的命令树是否存在逻辑漏洞。
3. 反馈循环:
如果 Agent 发现风险(比如发现你在没有 sudo 权限的情况下尝试修改系统配置,或者命令组合可能导致数据丢失),它会直接拦截并给出具体的修改建议。
这种做法其实是在尝试给 Shell 环境套上一层“逻辑护栏”。对于需要频繁操作生产环境或者编写自动化运维脚本的同学来说,这种基于 AST 的方案比那种只会提示“检测到危险字符”的傻瓜式工具要智能得多。
如果你想自己动手实现一个类似的校验逻辑,可以参考这个简单的 Python 伪代码思路,利用 bashlex 这个库来获取 AST:
import bashlex
def review_command(cmd_str):
try:
# 将命令解析为 AST
parts = bashlex.parse(cmd_str)
# 这里可以根据 parts 的结构进行深度遍历
# 比如检查是否存在特定的 Node 类型或者参数组合
for node in parts:
if node.kind == 'command':
# 模拟 Subagent 的逻辑判断
if 'rm' in [arg.word for arg in node.parts if hasattr(arg, 'word')]:
print(f"⚠️ 警告:检测到删除操作,请务必确认路径安全!")
return False
return True
except Exception as e:
print(f"解析失败: {e}")
return False
# 测试一下
review_command("rm -rf /var/log/old_logs")这种结合了确定性解析(AST)和概率性推理(LLM Agent)的工作流,感觉才是未来 AI 辅助工具该有的样子。
事件追踪 · 相关报道
Terminal Bench 3 这次测出来的分数真的能信吗
15天前
免费 AI 工具箱 · 全部完全免费
更多可复用的提示词工作流收录在ChatGPT提示词优化指南,有不少直接可参考的案例。