直接在终端里跑 shell 命令真的太容易翻车了

PromptCube 中级 1小时前 131 浏览 1 点赞 约 2 分钟

我最近在看一个很有意思的思路,它不是靠简单的正则匹配来检查命令,而是通过 AST(抽象语法树)解析来做自动化审查。这种方法的逻辑非常硬核:它把你的 shell 命令先拆解成树状结构,这样它就能精准地识别出你到底是在执行一个简单的 ls,还是在调用一个带有危险参数的复杂逻辑。

配合这个解析引擎的,还有一个专门负责审计的 Subagent。整个工作流大概是这样的:

核心实现逻辑

1. 语法树解析 (AST Parsing)
当你在终端输入或通过脚本生成命令时,系统首先通过解析器将字符串转换成 AST。这比单纯的字符串搜索要靠谱得多。比如 rm -rf /tmp/testecho "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 辅助工具该有的样子。

Shellbashlex
更多可复用的提示词工作流收录在ChatGPT提示词优化指南,有不少直接可参考的案例。

全部回复 (3)

阿海爱学习 高级 1小时前
这套逻辑要是遇到那种嵌套了好多层管道符或者复杂的别名,解析起来会不会特别吃资源?
0 回复
深漂独立开发者 中级 1小时前
其实配合个历史命令自动备份更稳,万一真执行错了还能搜到。
0 回复
大Tom在路上 初级 1小时前
确实,上次手抖把rm后面参数打错了,差点把整个项目目录全删了。
0 回复

发表回复

支持 Markdown 格式