搭建一个轻量 Agent Harness——让 AI Agent 安全地执行命令、读写文件
搭建一个轻量 Agent Harness——让 AI Agent 安全地执行命令、读写文件、调用 APIAgent 不只是调用 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_confirmTrue):self.workspacePath(workspace).resolve()self.workspace.mkdir(parentsTrue,exist_okTrue)self.require_confirmrequire_confirm self.history[]defexecute(self,command:str)-dict:在沙箱中执行命令。cmd_partsshlex.split(command)ifnotcmd_parts:return{error:Empty command}# 安全检查base_cmdcmd_parts[0]ifbase_cmdnotinself.ALLOWED_COMMANDS:return{error:f命令{base_cmd}不在白名单中}# 危险操作需要确认dangerousany(kincommandforkin[rm ,delete,DROP,,])ifdangerousandself.require_confirm:print(f\n⚠️ 危险操作{command})okinput(确认执行[y/N] ).strip().lower()ifok!y:return{error:用户取消}try:resultsubprocess.run(command,shellTrue,capture_outputTrue,textTrue,timeout30,cwdstr(self.workspace),)outputresult.stdout.strip()ifresult.returncode!0:outputresult.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:contentfull_path.read_text(encodingutf-8,errorsignore)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)}字符)okinput(确认写入[y/N] ).strip().lower()ifok!y:return{error:用户取消}try:full_path.parent.mkdir(parentsTrue,exist_okTrue)full_path.write_text(content,encodingutf-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()clientOpenAI(api_keyos.getenv(DEEPSEEK_API_KEY),base_urlhttps://api.deepseek.com/v1)harnessAgentHarness(./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:respclient.chat.completions.create(modeldeepseek-chat,messagesmessages,toolsTOOLS,tool_choiceauto)msgresp.choices[0].messageifnotmsg.tool_calls:returnmsg.contentfortcinmsg.tool_calls:nametc.function.name argsjson.loads(tc.function.arguments)ifnameexecute_command:resultharness.execute(args[command])elifnameread_file:resultharness.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)})# 使用resultrun_agent(在当前目录创建一个 hello.py内容为打印 Hello World然后运行它)print(result)总结一个轻量的 Agent Harness三个核心能力命令白名单限制 Agent 只能执行安全命令目录隔离Agent 只能操作工作目录内的文件危险操作确认删除、覆盖等需要人工审批几十行代码实现让你的 Agent 既强大又安全。本文由 Zyentor智元界原创发布本文发布于 Zyentor智元界 —— AI 开发者社区原文链接https://www.zyentor.com/news/4324