尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

一次 Codex 误删 H 盘的事故:从 Remove-Item 到 rmdir 的复盘与 TaoToken 配置防呆

发布时间:2026/9/26 11:00:44

资讯中心
01
ARTICLE

一次 Codex 误删 H 盘的事故:从 Remove-Item 到 rmdir 的复盘与 TaoToken 配置防呆

一次 Codex 误删 H 盘的事故:从 Remove-Item 到 rmdir 的复盘与 TaoToken 配置防呆
1. 事故现场一条 rmdir 命令如何把 H 盘清空先说结论这不是 Codex 变坏了而是它在 PowerShell 里拼了一条给 cmd.exe 用的命令转义没对齐路径解析跑偏递归删除的目标从子目录变成了盘符根。整个过程里最危险的不是rmdir /s /q本身而是「提权请求 转义失真 我没逐字看」这三件事叠在一起。场景还原一下。我让 Codex 清理它自己生成的测试目录tests_runtime位置在H:\WorkSpace\legado-cli\legado_cli\tests_runtime。前几次删除失败报的是 ACL 权限异常。Codex 于是请求提权说要用 Windows 原生目录删除接口直接删顶层目标目录。我没细看就点了同意它执行的是cmd.exe /c rmdir /s /q \H:\WorkSpace\legado-cli\legado_cli\tests_runtime\问题出在\上。在 PowerShell 里反斜杠不是转义引号的正确方式PowerShell 用的是反引号。所以这串参数在传给 cmd.exe 的过程中被重新解析引号边界错位cmd.exe 拿到的路径被截断或拼接成了H:\。rmdir /s /q一旦作用在盘符根上就是静默递归删除不弹确认。日志里那句Wall time: 14.7 seconds aborted by user说明我中途掐断了但已经删掉了一部分。这篇写给两类人一是正在用 Codex、Claude Code 这类 Agent 跑本地命令的开发者二是想给 AI 工具链加一层「防呆」的人。核心检索词就三个Codex 误删、Remove-Item 与 rmdir 的差异、TaoToken 统一 Key 接入配置。下面我会把命令差异、权限边界、可复制的配置骨架、以及误删前能跑的路径白名单验证动作一条条拆开。2. 命令差异与权限边界Remove-Item、rmdir、cmd.exe 到底差在哪2.1 三个删除动作的语义对照很多人以为Remove-Item -Recurse和rmdir /s /q是一回事其实它们分属两个 shell参数解析规则完全不同。命令所属环境递归参数静默参数引号转义危险点Remove-ItemPowerShell-Recurse-Force反引号路径通配符展开rmdir/rdcmd.exe/s/q双引号根路径无确认rm -rfbash/WSL-r-f单引号变量为空时删当前目录关键差异在转义。PowerShell 调 cmd.exe 时参数要经过两层解析PowerShell 先解析一次cmd.exe 再解析一次。如果你在 PowerShell 里写\PowerShell 不会把它当成转义引号而是当成「反斜杠 引号结束」于是后面的路径就暴露在参数流里被 cmd.exe 按空格和引号重新切分。2.2 权限边界为什么提权请求是最后一道闸Codex 第一次删tests_runtime失败报 ACL 异常。这时候它选择提权逻辑上没错——目录确实有权限限制。但提权之后它拿到的是「可以删这个目录」的权限而不是「只能删这个目录」的约束。Windows 的 ACL 管的是「能不能删」不管「删的是不是你以为的那个路径」。所以真正的边界不在权限系统而在命令构造。一旦路径解析跑偏提权只是让错误命令顺利执行而已。这也是为什么我在配置里加了路径白名单校验——在命令真正落到 shell 之前先检查目标路径是否在允许列表内。2.3 一个容易忽略的点Agent 的「重试」会放大风险Codex 不是一次就删错的。它先试了Remove-Item失败再试别的失败最后换cmd.exe /c rmdir。每一次重试它都在调整命令。调整过程中转义、引号、路径拼接都可能被改动。Agent 的目标是「把任务完成」不是「保证命令安全」。所以重试次数越多命令偏离原始意图的概率越大。3. TaoToken 前置统一 Key 接入让 Agent 调用可审计在讲防呆配置之前先解决一个前置问题Agent 调用的模型接口要统一、可审计。我用 TaoToken 做统一入口原因是它把模型对话、Coding Plan、API Keys 都放在一个控制台里Agent 每次请求走哪个 Key、调哪个模型都能在后台看到。接入方式很简单。先到控制台拿 Key# 控制台地址带来源标记 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite拿到 Key 之后API 基址用https://taotoken.net/api注意这个地址不加 UTM 参数直接作为 base_url 用。如果你用的是 OpenAI 兼容的客户端配置里填base_url https://taotoken.net/apiapi_key填你申请的那串。对于长期跑编码任务的场景比如 Codex、Claude Code 这类 Agent建议用 Coding Plan额度更稳https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite如果你只是想先验证模型通不通用模型对话页面最快https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewriteKey 管理在 API Keys 页面https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite接入文档在这里配置细节以文档为准https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewriteClaude Code 的接入说明单独有一页https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaude-code-anthropicutm_campaignrewrite统一 Key 的好处是Agent 的所有模型请求都走同一个入口出问题时能回溯是哪次对话触发了哪条命令。这跟防呆是配套的——命令层防呆管「删不删」接口层审计管「谁让它删的」。4. 可复制配置settings.json 与 config.toml 骨架4.1 Codex 的 settings.json 骨架Codex 的配置一般放在项目根或用户目录下的settings.json。下面这份骨架的重点是把危险命令的自动执行关掉加上路径白名单。{ model: gpt-4o, api_base: https://taotoken.net/api, api_key_env: TAOTOKEN_API_KEY, auto_execute: false, command_policy: { deny_patterns: [ rmdir\\s/s, rd\\s/s, Remove-Item.*-Recurse, rm\\s-rf, del\\s/[sf] ], require_confirmation: [ Remove-Item, rmdir, rd, del ], path_whitelist: [ H:\\WorkSpace\\legado-cli\\legado_cli\\tests_runtime, H:\\WorkSpace\\legado-cli\\legado_cli\\build ] } }几个字段说明。auto_execute: false是关键任何命令都要我确认。deny_patterns是硬拦截命中就直接拒绝不给提权机会。require_confirmation是软拦截弹确认框。path_whitelist是白名单只有列在这里的路径才允许递归删除。4.2 config.toml 骨架Claude Code / 通用 Agent如果你用的是 Claude Code 或支持 TOML 配置的 Agent用这份[model] provider openai-compatible base_url https://taotoken.net/api api_key_env TAOTOKEN_API_KEY model_name claude-3-5-sonnet [execution] auto_run false shell powershell timeout_seconds 30 [execution.safety] deny_commands [ rmdir /s, rd /s, Remove-Item -Recurse, rm -rf ] confirm_commands [Remove-Item, rmdir, del] allowed_delete_roots [ H:\\WorkSpace\\legado-cli\\legado_cli\\tests_runtime ]shell powershell这行很重要。如果你的 Agent 默认在 cmd.exe 里跑又混用 PowerShell 语法转义问题会反复出现。明确指定 shell能减少一层解析歧义。4.3 环境变量设置Key 不要写死在配置里用环境变量# PowerShell 里设置当前会话 $env:TAOTOKEN_API_KEY 你的Key # 永久设置用户级 [System.Environment]::SetEnvironmentVariable(TAOTOKEN_API_KEY, 你的Key, User)# bash / WSL export TAOTOKEN_API_KEY你的Key配置里用api_key_env引用这样配置文件可以进版本库Key 不会泄露。5. 验证请求与路径白名单检查误删前能跑的动作5.1 先验证接口通不通配置写完先别急着让 Agent 删东西。用一条最小请求验证 TaoToken 接口curl https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: gpt-4o, messages: [{role: user, content: ping}] }返回里有choices字段就说明 Key 和 base_url 都对。这一步能排掉大部分「配置没生效」的问题。5.2 路径白名单验证脚本在让 Agent 执行任何递归删除之前先跑这个脚本确认目标路径在白名单内且不是盘符根# check_delete_path.ps1 param( [Parameter(Mandatory$true)] [string]$TargetPath ) $whitelist ( H:\WorkSpace\legado-cli\legado_cli\tests_runtime, H:\WorkSpace\legado-cli\legado_cli\build ) # 1. 解析绝对路径 $resolved [System.IO.Path]::GetFullPath($TargetPath) # 2. 拒绝盘符根 if ($resolved -match ^[A-Za-z]:\\?$) { Write-Error 拒绝目标是盘符根 $resolved exit 1 } # 3. 检查是否在白名单内 $allowed $false foreach ($w in $whitelist) { if ($resolved.StartsWith($w, [System.StringComparison]::OrdinalIgnoreCase)) { $allowed $true break } } if (-not $allowed) { Write-Error 拒绝$resolved 不在白名单内 exit 1 } Write-Output 通过$resolved 允许删除 exit 0用法.\check_delete_path.ps1 -TargetPath H:\WorkSpace\legado-cli\legado_cli\tests_runtime输出通过才继续。如果输出拒绝目标是盘符根说明路径解析出了问题这时候绝对不能执行删除。5.3 用 dry-run 预览删除范围rmdir没有 dry-run但你可以先用Get-ChildItem列出会被删的内容# 预览列出目标目录下所有文件 Get-ChildItem -Path H:\WorkSpace\legado-cli\legado_cli\tests_runtime -Recurse | Select-Object FullName, Length | Format-Table -AutoSize如果列出来的路径里出现了H:\下的其他目录说明路径已经跑偏立刻停手。5.4 成功结果长什么样正常删除后你应该看到PS .\check_delete_path.ps1 -TargetPath H:\WorkSpace\legado-cli\legado_cli\tests_runtime 通过H:\WorkSpace\legado-cli\legado_cli\tests_runtime 允许删除 PS Remove-Item -Path H:\WorkSpace\legado-cli\legado_cli\tests_runtime -Recurse -Force PS Test-Path H:\WorkSpace\legado-cli\legado_cli\tests_runtime FalseTest-Path返回False说明目录已删。同时H:\下其他目录还在这才是正确结果。6. 本篇常见错排查6.1 报错Remove-Item : 无法删除项 ... 拒绝访问这是 ACL 权限问题不是路径问题。先确认目录属主Get-Acl H:\WorkSpace\legado-cli\legado_cli\tests_runtime | Format-List如果属主不是你用管理员 PowerShell 改属主takeown /f H:\WorkSpace\legado-cli\legado_cli\tests_runtime /r /d y icacls H:\WorkSpace\legado-cli\legado_cli\tests_runtime /grant $env:USERNAME:(F) /t改完再删。注意这一步只对白名单内的路径做别对盘符根做。6.2 报错cmd.exe /c rmdir删了不该删的这就是本篇事故的根因。排查顺序第一检查命令里的引号转义。PowerShell 调 cmd.exe正确写法是用单引号包外层或者用--%停止解析# 推荐用 PowerShell 原生命令别绕 cmd.exe Remove-Item -LiteralPath H:\WorkSpace\legado-cli\legado_cli\tests_runtime -Recurse -Force # 如果必须用 cmd.exe用 --% 停止 PowerShell 解析 cmd.exe /c --% rmdir /s /q H:\WorkSpace\legado-cli\legado_cli\tests_runtime-LiteralPath会禁用通配符展开比-Path更安全。第二检查 Agent 的 deny_patterns 是否生效。如果rmdir /s没被拦截说明配置没加载检查 settings.json 路径和 JSON 语法。6.3 报错TaoToken 返回 401Key 没读到。检查环境变量echo $env:TAOTOKEN_API_KEY如果为空重新设置。如果配置里写的是api_key_env确认字段名拼写正确。401 也可能是 Key 过期去 API Keys 页面重新生成https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite6.4 报错Agent 反复请求提权说明 deny_patterns 没拦住或者 Agent 绕过了配置。这时候先停掉 Agent手动检查它最近执行的命令历史。Codex 的命令历史一般在会话日志里翻到cmd.exe或Remove-Item那几行逐字看路径。如果 Agent 持续请求提权把auto_execute设为false所有命令手动确认。确认时重点看三样命令类型、目标路径、有没有/s或-Recurse。6.5 路径白名单没生效检查两点。一是白名单里的路径用了双反斜杠\\JSON 里必须转义。二是StartsWith比较时大小写。Windows 路径不区分大小写脚本里用了OrdinalIgnoreCase如果你自己写脚本记得加上。7. 把防呆做成习惯接入与排障入口事故之后我改了三件事。第一所有 Agent 的auto_execute一律设为false递归删除必须手动确认。第二路径白名单脚本进项目仓库每次删目录前先跑一遍。第三模型接口统一走 TaoTokenKey 用环境变量管理出问题能回溯。如果你也在跑 Codex 或 Claude Code建议从接入配置开始# 接入文档配置细节以这里为准 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite # API Keys 管理 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite # 长期编码任务用 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite最后留一个我踩过的坑别在 PowerShell 里用\给 cmd.exe 传路径。要么用 PowerShell 原生Remove-Item -LiteralPath要么用--%停止解析。这一条比任何配置都管用。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。