1. 卸载 OpenClaw 前先想清楚:为什么“删不干净”是常态
OpenClaw 这类本地 Agent 工具和普通桌面软件不太一样。它通常由三部分组成:一个常驻后台的服务进程、一份放在用户目录下的配置与凭据文件、以及若干注册到系统里的自启动项。你从控制面板点“卸载”,往往只删掉了主程序目录,服务注册、环境变量、~/.openclaw里的密钥缓存全都留着。下次重装时,旧配置和新版本打架,就会出现“明明卸载了却还报端口占用”的怪现象。
我试过在一台测试机上反复装删 OpenClaw,第一次偷懒只跑了官方卸载器,结果netstat里 8080 端口一直被占,排查半天才发现是残留的守护进程。从那以后我就固定用“备份 → 停止 → 删除 → 验证”四步走,每一步都有明确的产出物,卸载完能拿到一份验证报告,环境干净可复现。
这篇手册面向已经部署过 OpenClaw、现在要彻底清理的开发者。你会拿到可直接复制的备份命令、跨平台的停止与删除脚本、一份验证清单,以及卸载后如何用 TaoToken 统一 Key 通道接管后续工具接入的思路。核心检索词就三个:OpenClaw 卸载、OpenClaw 备份配置、OpenClaw 残留验证。适合谁?适合那些不想在系统里留垃圾、又希望后续换工具时密钥管理不乱的人。
先说清楚一个前提:卸载是不可逆操作,备份永远排在第一位。下面每一步我都给出 Windows PowerShell 和 macOS/Linux Shell 两套写法,你按自己的系统挑着用。整个流程建议在管理员/root 权限下执行,否则删注册表和系统服务会失败。
2. TaoToken 统一 Key 通道:卸载前先把凭据收拢
在动手删 OpenClaw 之前,有个容易被忽略的动作:把它里面配置的模型 API Key 先归拢出来。OpenClaw 的config.yml里通常写着某个模型的 Base URL 和 Key,如果你直接删目录,这些凭据就跟着没了,后面想复用还得重新申请。
我的做法是:卸载前把 OpenClaw 用到的 Key 统一迁到 TaoToken 的 Key 管理里。TaoToken 是一个统一 Key/API 通道,官网入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 端点是 https://taotoken.net/api 。它的价值在于:你后续无论接 Claude Code、Cline、Codex 还是别的编码工具,都可以共用同一套 Key 和 Base URL,不用每个工具单独配一遍。
具体怎么收拢?打开 OpenClaw 的配置文件,找到类似下面的字段:
# ~/.openclaw/config.yml 片段示例 model: provider: custom base_url: "https://taotoken.net/api" api_key: "sk-你的Key" model_id: "claude-sonnet-4-5"把api_key记下来,登录 TaoToken 控制台 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,在 API Keys 页面 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 确认这个 Key 还在、额度还够。如果 OpenClaw 里用的是临时 Key,建议在这里重新生成一个长期 Key,记到你的密码管理器里。
为什么要强调这一步?因为卸载 OpenClaw 之后,你大概率还会用别的 Agent 工具。与其每次换工具都重新折腾 Key,不如借这次卸载把凭据管理统一到一处。TaoToken 的接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,里面有各工具的 Base URL 填法,卸载完可以直接照着接新工具。
这里要提醒一句:不要把生产环境的数据库连接串、内部服务地址写进任何第三方通道的配置里。TaoToken 只用来管模型调用的 Key,业务凭据该放本地密钥库就放本地。卸载 OpenClaw 时,config.yml里如果有业务相关的敏感字段,备份后要单独加密存放,别随手丢桌面。
收拢完凭据,你就可以放心进入备份环节了。记住顺序:先确认 Key 有备份或已迁移,再动删除命令。这样即使卸载过程中出了岔子,你的模型调用能力也不会断。
3. 可复制配置:备份、停止、删除三段脚本
这一节是整篇的核心,三段脚本分别对应前三步。每段都可以单独跑,也可以串起来。我按“先备份、再停止、后删除”的顺序给,你复制到本地.ps1或.sh文件里执行即可。
3.1 备份脚本:配置、环境变量、任务清单一网打尽
Windows PowerShell 版本:
# backup_openclaw.ps1 $stamp = Get-Date -Format 'yyyyMMdd_HHmmss' $backupDir = "$env:USERPROFILE\Desktop\OpenClaw_Backup_$stamp" New-Item -ItemType Directory -Path $backupDir -Force | Out-Null # 1. 备份配置目录 if (Test-Path "$env:USERPROFILE\.openclaw") { Copy-Item -Recurse "$env:USERPROFILE\.openclaw" "$backupDir\openclaw_config" -Force Write-Host "[OK] 配置目录已备份" } # 2. 备份环境变量 Get-ChildItem Env: | Where-Object { $_.Name -like "*CLAW*" -or $_.Value -like "*openclaw*" } | Export-Csv "$backupDir\env_vars.csv" -NoTypeInformation -Encoding UTF8 Write-Host "[OK] 环境变量已备份" # 3. 记录卸载前状态 $statusFile = "$backupDir\status_before.txt" "OpenClaw 卸载前状态 @ $stamp" | Out-File $statusFile -Encoding UTF8 "--- 服务 ---" | Out-File $statusFile -Append -Encoding UTF8 Get-Service | Where-Object {$_.Name -like "*claw*"} | Out-File $statusFile -Append -Encoding UTF8 "--- 进程 ---" | Out-File $statusFile -Append -Encoding UTF8 Get-Process | Where-Object {$_.Name -like "*claw*"} | Select-Object Name,Id,Path | Out-File $statusFile -Append -Encoding UTF8 "--- 安装路径 ---" | Out-File $statusFile -Append -Encoding UTF8 Get-Command openclaw -ErrorAction SilentlyContinue | Select-Object Source | Out-File $statusFile -Append -Encoding UTF8 Write-Host "[OK] 状态记录已保存到 $statusFile" Write-Host "备份完成:$backupDir"macOS/Linux 版本:
#!/bin/bash # backup_openclaw.sh STAMP=$(date +%Y%m%d_%H%M%S) BACKUP_DIR="$HOME/OpenClaw_Backup_$STAMP" mkdir -p "$BACKUP_DIR" # 1. 备份配置目录 if [ -d "$HOME/.openclaw" ]; then cp -r "$HOME/.openclaw" "$BACKUP_DIR/openclaw_config" echo "[OK] 配置目录已备份" fi # 2. 备份 shell 里的相关环境变量 grep -E "(CLAW|claw)" "$HOME/.bashrc" "$HOME/.bash_profile" "$HOME/.zshrc" 2>/dev/null \ > "$BACKUP_DIR/env_vars.txt" || true echo "[OK] 环境变量已备份" # 3. 导出任务列表(如果 CLI 还在) if command -v openclaw >/dev/null 2>&1; then openclaw task list > "$BACKUP_DIR/task_list.txt" 2>/dev/null || true echo "[OK] 任务列表已导出" fi # 4. 记录卸载前状态 { echo "OpenClaw 卸载前状态 @ $STAMP" echo "--- 进程 ---" ps aux | grep -i claw | grep -v grep || echo "无" echo "--- 监听端口 ---" (lsof -i -P 2>/dev/null | grep -i claw) || echo "无" } > "$BACKUP_DIR/status_before.txt" echo "[OK] 状态记录已保存" echo "备份完成:$BACKUP_DIR"跑完这段,桌面上会多出一个带时间戳的备份目录。里面openclaw_config是完整配置,env_vars是环境变量快照,status_before.txt是卸载前的服务/进程/端口状态。这份状态文件在第四步验证时能直接对照,非常有用。
3.2 停止脚本:服务、进程、端口三连清
Windows PowerShell 版本:
# stop_openclaw.ps1 Write-Host "=== 停止 OpenClaw 服务 ===" $services = @('OpenClaw','OpenClawAgent','ClawScheduler','ClawDaemon','ClawService') foreach ($name in $services) { $svc = Get-Service -Name $name -ErrorAction SilentlyContinue if ($svc -and $svc.Status -eq 'Running') { Stop-Service -Name $name -Force Write-Host "[OK] 已停止服务 $name" } } Start-Sleep -Seconds 3 Write-Host "=== 结束 OpenClaw 进程 ===" Get-Process | Where-Object { $_.Name -like "*claw*" -or $_.Name -like "*openclaw*" } | ForEach-Object { Write-Host "结束进程 $($_.Name) (PID $($_.Id))" Stop-Process -Id $_.Id -Force } Start-Sleep -Seconds 2 Write-Host "=== 检查残留 ===" $left = Get-Process | Where-Object {$_.Name -like "*claw*"} if ($left) { Write-Host "[警告] 仍有进程:$($left.Name)" -ForegroundColor Red } else { Write-Host "[OK] 无残留进程" -ForegroundColor Green }macOS/Linux 版本:
#!/bin/bash # stop_openclaw.sh echo "=== 停止 systemd 服务 ===" for svc in $(systemctl list-units --type=service --state=running 2>/dev/null | grep -i claw | awk '{print $1}'); do sudo systemctl stop "$svc" echo "[OK] 已停止 $svc" done echo "=== 停止 LaunchAgent/Daemon (macOS) ===" for plist in /Library/LaunchDaemons/com.openclaw.* ~/Library/LaunchAgents/com.openclaw.*; do [ -f "$plist" ] || continue name=$(basename "$plist" .plist) sudo launchctl unload "$plist" 2>/dev/null sudo launchctl remove "$name" 2>/dev/null echo "[OK] 已卸载 $name" done echo "=== 结束进程 ===" pkill -TERM -f openclaw 2>/dev/null sleep 2 pkill -KILL -f openclaw 2>/dev/null echo "=== 检查残留 ===" if pgrep -f openclaw >/dev/null; then echo "[警告] 仍有进程:" ps aux | grep -i claw | grep -v grep else echo "[OK] 无残留进程" fi停止这一步的关键是“先服务后进程”。服务不先停,进程杀了也会被守护进程拉起来。脚本里Start-Sleep那几秒别省,给系统一点时间释放端口和文件句柄。
3.3 删除脚本:文件、注册表、环境变量
Windows PowerShell 版本:
# delete_openclaw.ps1 Write-Host "=== 删除程序文件 ===" $paths = @( "C:\Program Files\OpenClaw", "C:\Program Files (x86)\OpenClaw", "C:\ProgramData\OpenClaw", "$env:USERPROFILE\.openclaw", "$env:LOCALAPPDATA\OpenClaw", "$env:APPDATA\OpenClaw" ) foreach ($p in $paths) { if (Test-Path $p) { Remove-Item -Path $p -Recurse -Force -ErrorAction SilentlyContinue if (Test-Path $p) { Write-Host "[警告] 未能完全删除 $p(可能被占用)" -ForegroundColor Yellow } else { Write-Host "[OK] 已删除 $p" } } } Write-Host "=== 清理注册表 ===" $regs = @( "HKLM:\SOFTWARE\OpenClaw", "HKLM:\SOFTWARE\WOW6432Node\OpenClaw", "HKCU:\SOFTWARE\OpenClaw", "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenClaw" ) foreach ($r in $regs) { if (Test-Path $r) { Remove-Item -Path $r -Recurse -Force -ErrorAction SilentlyContinue Write-Host "[OK] 已删除注册表项 $r" } } Write-Host "=== 清理 PATH 环境变量 ===" $machinePath = [Environment]::GetEnvironmentVariable("Path", "Machine") $clean = ($machinePath -split ';' | Where-Object { $_ -notlike "*OpenClaw*" }) -join ';' [Environment]::SetEnvironmentVariable("Path", $clean, "Machine") Write-Host "[OK] PATH 已清理"macOS/Linux 版本:
#!/bin/bash # delete_openclaw.sh echo "=== 删除程序与配置目录 ===" TARGETS=( "$HOME/.openclaw" "$HOME/.config/openclaw" "$HOME/Library/Application Support/OpenClaw" "/usr/local/bin/openclaw" "/opt/openclaw" "/etc/openclaw" ) for t in "${TARGETS[@]}"; do if [ -e "$t" ]; then sudo rm -rf "$t" echo "[OK] 已删除 $t" fi done echo "=== 清理 shell 配置里的相关行 ===" for rc in "$HOME/.bashrc" "$HOME/.bash_profile" "$HOME/.zshrc"; do [ -f "$rc" ] || continue cp "$rc" "$rc.bak_openclaw" grep -v -i "openclaw\|CLAW" "$rc.bak_openclaw" > "$rc" echo "[OK] 已清理 $rc(备份为 $rc.bak_openclaw)" done echo "=== 刷新 systemd ===" sudo systemctl daemon-reload 2>/dev/null || true echo "删除完成"删除脚本里我特意保留了$rc.bak_openclaw备份。改 shell 配置文件有风险,万一 grep 误删了别的行,还能从备份恢复。Windows 那边删注册表前也建议先导出:reg export "HKLM\SOFTWARE\OpenClaw" openclaw_reg_backup.reg,出问题能还原。
4. 验证请求:确认无残留并跑通一次模型调用
删完不代表结束,第四步验证才是“卸载干净”的证明。验证分两层:系统层确认无残留,应用层确认你的 Key 通道还能正常用。
4.1 系统层验证清单
Windows PowerShell:
# verify_openclaw.ps1 Write-Host "=== 验证服务 ===" $svc = Get-Service | Where-Object {$_.Name -like "*claw*"} if ($svc) { Write-Host "[残留] $($svc.Name)" -ForegroundColor Red } else { Write-Host "[OK] 无残留服务" -ForegroundColor Green } Write-Host "=== 验证进程 ===" $proc = Get-Process | Where-Object {$_.Name -like "*claw*"} if ($proc) { Write-Host "[残留] $($proc.Name)" -ForegroundColor Red } else { Write-Host "[OK] 无残留进程" -ForegroundColor Green } Write-Host "=== 验证文件 ===" $check = @("C:\Program Files\OpenClaw","C:\ProgramData\OpenClaw","$env:USERPROFILE\.openclaw") $found = $false foreach ($c in $check) { if (Test-Path $c) { Write-Host "[残留] $c" -ForegroundColor Red; $found = $true } } if (-not $found) { Write-Host "[OK] 无残留文件" -ForegroundColor Green } Write-Host "=== 验证端口 ===" $ports = netstat -ano | Select-String ":8080|:9090" if ($ports) { Write-Host "[注意] 端口仍被占用,检查是否其他程序" -ForegroundColor Yellow; $ports } else { Write-Host "[OK] 相关端口已释放" -ForegroundColor Green }macOS/Linux:
#!/bin/bash # verify_openclaw.sh echo "=== 验证进程 ===" pgrep -f openclaw >/dev/null && echo "[残留] 仍有进程" || echo "[OK] 无残留进程" echo "=== 验证文件 ===" for p in "$HOME/.openclaw" "/usr/local/bin/openclaw" "/opt/openclaw"; do [ -e "$p" ] && echo "[残留] $p" || true done echo "[OK] 文件检查完成" echo "=== 验证端口 ===" ss -tulpn 2>/dev/null | grep -E ":8080|:9090" && echo "[注意] 端口占用" || echo "[OK] 端口已释放" echo "=== 验证命令 ===" command -v openclaw >/dev/null && echo "[残留] openclaw 命令仍可用" || echo "[OK] 命令已移除"对照第 3.1 节备份的status_before.txt,逐项打勾。如果服务、进程、文件、端口、命令五项全过,系统层就算干净了。
4.2 应用层验证:用 TaoToken 跑一次模型调用
系统干净了,还得确认你的 Key 通道没被卸载动作影响。用 curl 直接打一次 TaoToken 的 API,验证 Key 有效:
curl -X POST https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer sk-你的Key" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-5", "messages": [{"role": "user", "content": "回复 OK 两个字母即可"}], "max_tokens": 16 }'正常返回里会有choices数组,message.content是模型回复。如果返回 401,说明 Key 无效或已过期,去 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 重新生成。如果返回local proxy failed之类,检查你的网络出口是否正常,别把本地代理配置残留带进来。
这一步的意义在于:卸载 OpenClaw 后,你的模型调用能力应该无缝转移到新工具上。TaoToken 的模型对话入口在 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,你也可以直接在网页上试一句,确认通道通畅。
验证通过后,建议把验证报告存一份:
# 生成验证报告 $report = "$env:USERPROFILE\Desktop\openclaw_uninstall_report.txt" "OpenClaw 卸载验证报告 @ $(Get-Date)" | Out-File $report -Encoding UTF8 "服务: $(if($svc){'残留'}else{'干净'})" | Out-File $report -Append -Encoding UTF8 "进程: $(if($proc){'残留'}else{'干净'})" | Out-File $report -Append -Encoding UTF8 "文件: $(if($found){'残留'}else{'干净'})" | Out-File $report -Append -Encoding UTF8 Write-Host "报告已保存:$report"5. 本篇常见错排查:401、local proxy failed、OAuth 报错
卸载和验证过程中,最容易撞上这几类报错。我按真实遇到的顺序列出来,附上定位思路。
401 Unauthorized:curl 验证时返回 401,八成是 Key 写错了或已失效。先确认Authorization: Bearer后面没有多余空格,再登录 TaoToken 控制台看 Key 状态。如果 Key 是在 OpenClaw 里用的旧 Key,可能已经随配置删除而失效,重新生成一个即可。注意别把 Key 硬编码进脚本提交到 Git,用环境变量TAOTOKEN_API_KEY传。
local proxy failed / connection refused:这个报错通常出现在你本机还残留代理配置时。卸载 OpenClaw 后,检查~/.bashrc或系统环境变量里有没有HTTP_PROXY、HTTPS_PROXY指向一个已经关掉的本地端口。有的话清掉,重新开终端再试。TaoToken 的 API 端点 https://taotoken.net/api 直连即可,不需要额外代理层。
reading choices 报错 / 返回体解析失败:如果你用脚本解析返回,报cannot read property 'choices' of undefined,说明返回的不是预期 JSON。先curl -i看 HTTP 状态码和原始 body。常见原因是请求体 JSON 格式错误,比如messages写成了字符串。用jq校验一下:echo '{"model":"...","messages":[...]}' | jq .。
OAuth 相关报错:如果你之前用 Claude Code 或 Codex 的 OAuth 登录方式接过 OpenClaw,卸载后这些工具的auth.json或凭据缓存可能还在。检查~/.claude/、~/.codex/目录,确认里面的 Base URL 指向的是 https://taotoken.net/api 而不是已失效的旧地址。需要重配的话,三件套是:Base URL 填https://taotoken.net/api,Key 填 TaoToken 生成的 Key,Model ID 填你要用的模型名(如claude-sonnet-4-5)。这三项在 TaoToken 接入文档 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 里有各工具的对照表。
文件删不掉 / 提示被占用:Windows 上常见于C:\ProgramData\OpenClaw下的日志文件被句柄占用。先跑停止脚本,再不行就重启进安全模式删。macOS/Linux 上用lsof +D ~/.openclaw看哪个进程占着,杀掉再删。
服务删了又回来:说明有守护进程或计划任务在拉起它。Windows 检查任务计划程序里有没有 OpenClaw 相关任务;Linux 检查crontab -l和/etc/cron.d/。这些不在主目录里,容易漏。
排查完这些,你的环境基本就干净了。如果后续要接新工具,长期编码或 Agent 场景可以直接看 Coding Plan https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,把 Key 和 Base URL 填进去就能跑,不用再折腾一遍配置。
6. 卸载之后:用统一 Key 通道接管后续工具接入
OpenClaw 卸载完,你的机器上少了一个 Agent,但模型调用需求还在。这时候最省事的做法,是让所有后续工具都走同一套 Key 通道,而不是每个工具单独配一遍。
具体操作路径是这样的:先去 TaoToken 控制台 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 确认你的 Key 和额度,然后在 API Keys 页面 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 生成或复制 Key。接着按你要用的工具,在接入文档 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 里找对应的配置片段。
以 Claude Code 为例,配置通常写在~/.claude/settings.json或环境变量里,核心三项:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-你的Key", "ANTHROPIC_MODEL": "claude-sonnet-4-5" } }Cline 这类 VS Code 插件则在设置里填 Base URL、API Key、Model ID 三项。Codex 的auth.json同理。三件套填对,基本就能跑通。如果你只是想在网页上快速验证模型是否可用,直接开模型对话 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 发一句话就行。
我自己的习惯是:卸载任何 Agent 工具前,先把 Key 迁到 TaoToken,卸载后用 curl 验证一次,再按新工具的文档填三件套。这样整个流程是可复现的,换机器、换工具都不用重新申请凭据。卸载 OpenClaw 只是清理动作,真正的价值在于借这次机会把凭据管理理顺,后面接什么工具都省事。