当前位置: 首页 > news >正文

搭建一个轻量 Agent Harness——让 AI Agent 安全地执行命令、读写文件

搭建一个轻量 Agent Harness——让 AI Agent 安全地执行命令、读写文件、调用 API

Agent 不只是调用 LLM,还需要执行命令、读写文件、调 API。但让 AI 直接操作你的电脑是有风险的。Agent Harness 就是解决这个问题的——给 Agent 一个受限的"沙箱"。

Harness 做什么

Agent 想做什么 → Harness 检查和审批 → 执行 → 返回结果 核心能力: ├─ 🛡️ 沙箱执行:限制 Agent 只能操作指定目录 ├─ 📋 命令白名单:只允许安全的命令 └─ ✅ 人工审批:危险操作需要确认

核心代码

# harness.pyimportsubprocess,os,shlexfrompathlibimportPathclassAgentHarness:"""Agent 安全执行环境。"""ALLOWED_COMMANDS={"ls","cat","head","tail","grep","wc","find","echo","date","python","pip","git"}def__init__(self,workspace="./agent_workspace",require_confirm=True):self.workspace=Path(workspace).resolve()self.workspace.mkdir(parents=True,exist_ok=True)self.require_confirm=require_confirm self.history=[]defexecute(self,command:str)->dict:"""在沙箱中执行命令。"""cmd_parts=shlex.split(command)ifnotcmd_parts:return{"error":"Empty command"}# 安全检查base_cmd=cmd_parts[0]ifbase_cmdnotinself.ALLOWED_COMMANDS:return{"error":f"命令{base_cmd}不在白名单中"}# 危险操作需要确认dangerous=any(kincommandforkin["rm ","delete","DROP",">",">>"])ifdangerousandself.require_confirm:print(f"\n⚠️ 危险操作:{command}")ok=input("确认执行?[y/N] ").strip().lower()ifok!="y":return{"error":"用户取消"}try:result=subprocess.run(command,shell=True,capture_output=True,text=True,timeout=30,cwd=str(self.workspace),)output=result.stdout.strip()ifresult.returncode!=0:output=result.stderr.strip()oroutput self.history.append({"command":command,"output":output[:500]})return{"output":output[:2000],"code":result.returncode}exceptsubprocess.TimeoutExpired:return{"error":"命令执行超时(30s)"}exceptExceptionase:return{"error":str(e)}defread_file(self,path:str)->dict:"""安全读取文件。"""full_path=(self.workspace/path).resolve()ifnotstr(full_path).startswith(str(self.workspace)):return{"error":"不能读取工作目录以外的文件"}try:content=full_path.read_text(encoding="utf-8",errors="ignore")return{"content":content[:5000]}exceptExceptionase:return{"error":str(e)}defwrite_file(self,path:str,content:str)->dict:"""安全写入文件。"""full_path=(self.workspace/path).resolve()ifnotstr(full_path).startswith(str(self.workspace)):return{"error":"不能写入工作目录以外的文件"}ifself.require_confirm:print(f"\n📝 即将写入:{path}{len(content)}字符)")ok=input("确认写入?[y/N] ").strip().lower()ifok!="y":return{"error":"用户取消"}try:full_path.parent.mkdir(parents=True,exist_ok=True)full_path.write_text(content,encoding="utf-8")return{"status":"ok","path":str(full_path.relative_to(self.workspace))}exceptExceptionase:return{"error":str(e)}

Agent + Harness 组合使用

# agent_with_harness.pyfromopenaiimportOpenAIfromharnessimportAgentHarnessimportos,jsonfromdotenvimportload_dotenv load_dotenv()client=OpenAI(api_key=os.getenv("DEEPSEEK_API_KEY"),base_url="https://api.deepseek.com/v1")harness=AgentHarness("./workspace")TOOLS=[{"type":"function","function":{"name":"execute_command","description":"在沙箱中执行命令。可用命令:ls, cat, grep, find, python, git","parameters":{"type":"object","properties":{"command":{"type":"string"}},"required":["command"]}}},{"type":"function","function":{"name":"read_file","description":"读取工作目录中的文件","parameters":{"type":"object","properties":{"path":{"type":"string"}},"required":["path"]}}}]defrun_agent(task):messages=[{"role":"system","content":f"你是一个编程助手。工作目录:{harness.workspace}"}]messages.append({"role":"user","content":task})whileTrue:resp=client.chat.completions.create(model="deepseek-chat",messages=messages,tools=TOOLS,tool_choice="auto")msg=resp.choices[0].messageifnotmsg.tool_calls:returnmsg.contentfortcinmsg.tool_calls:name=tc.function.name args=json.loads(tc.function.arguments)ifname=="execute_command":result=harness.execute(args["command"])elifname=="read_file":result=harness.read_file(args["path"])else:result={"error":"Unknown tool"}messages.append(msg)messages.append({"role":"tool","tool_call_id":tc.id,"content":json.dumps(result)})# 使用result=run_agent("在当前目录创建一个 hello.py,内容为打印 Hello World,然后运行它")print(result)

总结

一个轻量的 Agent Harness,三个核心能力:

  1. 命令白名单:限制 Agent 只能执行安全命令
  2. 目录隔离:Agent 只能操作工作目录内的文件
  3. 危险操作确认:删除、覆盖等需要人工审批

几十行代码实现,让你的 Agent 既强大又安全。

本文由 Zyentor(智元界)原创发布


本文发布于 Zyentor(智元界) —— AI 开发者社区
原文链接:https://www.zyentor.com/news/4324

http://www.jsqmd.com/news/1114203/

相关文章:

  • 单张RTX 4090能跑的最强开源大模型实测对比
  • PHP WebSocket端到端加密实战:从ECDH密钥交换到AES-GCM消息保护
  • 性价比高的百年药企选哪家
  • 如何用免费工具FanControl快速解决Windows电脑风扇噪音与散热问题?
  • 【新手上路】多目标优化问题
  • GBase 8a数据库Hive外部表核心特性简介
  • 新增AI治理与云原生架构两门核心科目,软考2026难度跃升47%?资深阅卷组长亲述命题逻辑与备考黄金窗口期
  • 用了 SiC、GaN,为什么仿真越跑越不敢信?
  • 本地部署AutoGPT:构建可审计、可编排的AI智能体平台
  • 中小企业AI落地:挑战、策略与实战指南
  • 中小企业知识产权布局:商标、专利、版权零基础科
  • Web安全实战:从SQL注入到XSS,开发者必知的核心漏洞与防御
  • 终极Windows风扇控制解决方案:FanControl让你的电脑既安静又高效
  • 为电视研发团队搭一套“统一开发环境“——一次工程效率的复盘
  • Gemini 3.1 Pro与Nano Banana 2工程选型实战:多模态推理在OCR、文档问答与边缘部署中的能力切片分析
  • 终极HS2游戏增强补丁:Honey Select 2的完整优化解决方案指南 [特殊字符]
  • 为什么92%的ChatGPT用户提示词失效?(结构化模板缺失导致响应准确率下降67%——权威A/B测试实录)
  • 路面缺陷检测数据集(9类YOLO已标注已划分)| 道路病害目标检测专用数据集
  • AppleRa1n:iOS 15-16激活锁绕过完整指南,5分钟快速解锁你的iPhone
  • 结构化提示词设计全栈手册,覆盖角色/任务/约束/示例/格式五大核心维度(2024最新LLM交互范式)
  • DLSS Swapper终极指南:一键智能切换DLSS版本,轻松提升游戏帧率
  • 深度解析:Linux内核下802.11ac无线网卡驱动架构与实现机制
  • ChatGPT提示词编写进阶指南(从“能用”到“稳赢”的5层能力跃迁)
  • 为什么你的提示词总被忽略?揭秘OpenAI官方未公开的token注意力衰减机制
  • Unitree GO2 ROS2 SDK异步控制架构深度解析与性能优化实践
  • 告别“缺少DLL文件“困扰:VisualCppRedist AIO一站式解决方案
  • Biotinyl-Pancreatic Polypeptide (human)
  • 2026吉安黄金回收白银回收铂金回收旧料回收怎么选?五家高实价铂金白银线下门店测评清单 + 联系方式
  • 【提示词效能倍增公式】:基于12762条生产级对话数据验证的3变量动态模型
  • 2026破圈!5款一键生成论文工具实测,专治选择困难,初稿框架5分钟搭好!