Appearance
OpenClaw 怎么安装?一键命令 + 脚本原理深度拆解
最快安装方式: macOS/Linux 一行
curl,Windows 一行 PowerShell,自动搞定 Node.js、Git 等所有依赖。下面先给命令,再拆解这行命令背后的 2000 行代码到底在做什么。更新于 2026年4月 | 出品:极拓工坊
OpenClaw 一键安装命令
macOS / Linux
bash
curl -fsSL https://www.gitapp.net/scripts/install-openclaw.sh | bash指定版本安装:
bash
curl -fsSL https://www.gitapp.net/scripts/install-openclaw.sh | bash -s -- --version 1.2.3Windows
打开 PowerShell,执行:
powershell
irm https://www.gitapp.net/scripts/install-openclaw.ps1 | iex指定版本安装:
powershell
$env:OPENCLAW_VERSION='1.2.3'; irm https://www.gitapp.net/scripts/install-openclaw.ps1 | iex安装要求
| 条件 | 说明 |
|---|---|
| Node.js v22+ | 脚本自动检测,没有会自动安装 |
| Git | 脚本自动检测,没有会自动安装 |
| 网络 | 需要访问 npm 仓库,国内自动切换镜像源 |
| 权限 | 优先用户目录安装,不强制要求管理员权限 |
不需要手动准备任何东西。 脚本会检测你的环境,缺什么装什么,装过的跳过。
这行命令背后到底做了什么?
用户看到的是一行 curl | bash,开发者写的是 2000 行"如果这个不行就试那个"。
以 OpenClaw 的安装脚本为例——PowerShell 版 700+ 行,Bash 版 500+ 行——它要处理的不是"下载一个文件",而是在一台完全未知状态的机器上,确保所有依赖就位、版本正确、路径可用、网络可达。
核心流程就 7 步:
检测 Node.js → 检测 Git → 设置镜像 → 安装 pnpm → 安装 OpenClaw → 验证 → 配置但每一步背后都是大量的"如果失败了怎么办"。
第一层:环境检测——你的机器是什么状态?
安装脚本面对的第一个问题:用户的机器上可能有任何东西,也可能什么都没有。
Node.js 的检测链
OpenClaw 需要 Node.js v22+。听起来简单——node -v 看一下版本不就行了?
实际上脚本要处理以下所有情况:
| 场景 | 用户机器状态 | 脚本策略 |
|---|---|---|
| 理想情况 | Node.js v22 已装好,在 PATH 里 | 直接用 |
| 版本太低 | 装了 Node.js v16 | 装 v22,确保 v22 优先级高于 v16 |
| nvm 管理 | 通过 nvm 装了多版本 | 用 nvm install 22 && nvm use 22 |
| 装了但不在 PATH | 文件存在,PATH 没配 | 扫描常见路径,找到后加入 PATH |
| 完全没装 | 裸机 | 下载安装 |
| 有冲突 | 系统 PATH 有 v16,用户 PATH 有 v22 | 调整 PATH 优先级 |
看看实际代码怎么处理(PowerShell 版简化):
powershell
function Step-CheckNode {
# 1. 有 nvm 吗?优先用 nvm 管理
if (Test-NvmInstalled) {
if (Test-NvmNodeActive -Major 22) {
# nvm 已激活 v22,直接用
return $true
}
# nvm 装了但没激活 v22,装一个
if (Install-NodeViaNvm) { return $true }
}
# 2. 之前脚本装过吗?(检查固定路径)
$scriptInstallDir = Join-Path (Get-LocalAppData) "nodejs"
if (Test-Path "$scriptInstallDir\node.exe") {
$ver = Get-NodeVersion -NodeExe "$scriptInstallDir\node.exe"
if ($ver) { return $true }
}
# 3. PATH 里有合格版本吗?
$ver = Get-NodeVersion
if ($ver) { return $true }
# 4. 都没有,直接下载安装
if (Install-NodeDirect) { return $true }
# 5. 全失败
return $false
}核心设计思想:瀑布式降级。 从最理想的情况开始尝试,逐级降级到最后的"直接下载"方案。每一级失败不报错,静默尝试下一级。
Bash 版的同样逻辑,但多了 Homebrew
macOS 上多了一个维度——Homebrew:
bash
step_check_node() {
# 先扩展 PATH,覆盖 Homebrew、nvm 等常见路径
ensure_path
# 检查已有版本
if ver=$(check_node_version); then
success "Node.js $ver 满足要求"
return 0
fi
# 瀑布式降级
install_node_via_nvm && return 0 # 优先 nvm
install_node_via_brew && return 0 # 其次 Homebrew
install_node_direct && return 0 # 最后直接下载
error "所有安装方式均失败"
return 1
}第二层:PATH 地狱——装了不等于能用
这是安装脚本中最容易出 bug 的地方。软件装好了,但 node 命令找不到,或者找到的是旧版本。
问题:PATH 优先级冲突
假设用户机器上:
- 系统 PATH 里有
C:\Program Files\nodejs\(v16) - 用户 PATH 里有
C:\Users\xxx\AppData\Local\nodejs\(v22)
Windows 先查系统 PATH,所以 node -v 返回 v16——刚装的 v22 被旧版本"遮蔽"了。
解决方案:强制优先级
powershell
function Ensure-NodePriority {
param([string]$NodeV22Dir)
$machinePath = [Environment]::GetEnvironmentVariable("PATH", "Machine")
$machineDirs = $machinePath.Split(";")
# 检查是否有低版本 Node.js 排在 v22 前面
foreach ($dir in $machineDirs) {
$nodeExe = Join-Path $dir "node.exe"
if (Test-Path $nodeExe) {
$output = & $nodeExe -v
if ($output -match "v(\d+)" -and [int]$Matches[1] -lt 22) {
# 发现冲突!把 v22 的路径提到最前面
$newDirs = @($NodeV22Dir) + ($machineDirs | Where-Object { $_ -ne $NodeV22Dir })
[Environment]::SetEnvironmentVariable("PATH", ($newDirs -join ";"), "Machine")
return
}
}
}
}如果修改系统 PATH 需要管理员权限怎么办?脚本会弹出 UAC 提权请求。如果用户拒绝了提权呢?还有 Plan C——直接修改 openclaw 的启动脚本,把 node 的路径写死:
powershell
function Patch-OpenclawShim {
# 把 openclaw.cmd 里的 "node" 替换成完整路径
$patched = $content -replace '(?m)^(@?)node(\.exe)?\s', "`$1`"$nodeExe`" "
Set-Content -Path $shimPath -Value $patched
}这就是防御式编程:Plan A 不行有 Plan B,Plan B 不行有 Plan C,每一层都有降级方案。
Bash 版:Shell 配置文件的碎片化
Linux/macOS 的 PATH 持久化更麻烦——不同 shell 用不同配置文件:
bash
get_shell_profiles() {
local profiles=()
# zsh 用 .zshrc
if [[ "$login_shell" == *zsh* ]]; then
profiles+=("$HOME/.zshrc")
# bash 用 .bash_profile 或 .bashrc
elif [[ "$login_shell" == *bash* ]]; then
profiles+=("$HOME/.bash_profile" "$HOME/.bashrc")
fi
# macOS 默认是 zsh,保底加上
[[ "$OS" == "darwin" ]] && profiles+=("$HOME/.zshrc")
}
persist_path_entry() {
local bin_dir="$1"
for profile in "${profiles[@]}"; do
# 已经写过就跳过(幂等性)
grep -qF "$bin_dir" "$profile" 2>/dev/null && continue
printf '\n# Added by OpenClaw installer\nexport PATH="%s:$PATH"\n' "$bin_dir" >> "$profile"
done
}第三层:网络故障处理——在中国装 GitHub 上的东西
这是国内用户最常遇到的问题:GitHub 访问不稳定。OpenClaw 的依赖需要从 GitHub 下载,脚本为此做了三层网络降级:
第一层:npm 镜像
powershell
$env:npm_config_registry = "https://registry.npmmirror.com"这只解决了 npm 包的下载问题。但有些依赖在安装时会用 git clone 从 GitHub 拉代码。
第二层:Git URL 重写
powershell
# 把 SSH 协议的 GitHub 地址自动转成 HTTPS
$env:GIT_CONFIG_KEY_0 = "url.https://github.com/.insteadOf"
$env:GIT_CONFIG_VALUE_0 = "git+ssh://[email protected]/"通过环境变量临时修改 Git 行为,不改用户的 git config(安装完就恢复)。
第三层:GitHub 镜像站
如果直连 GitHub 彻底不行,给用户三个选择:
1) 使用 GitHub 社区镜像继续安装
(镜像由第三方提供,存在内容被篡改的风险)
2) 手动配置代理后重试
(需要你有可用的代理工具)
0) 退出安装选了镜像后,脚本并行探测哪些镜像可用:
powershell
$gitHubMirrors = @(
"https://bgithub.xyz/",
"https://kkgithub.com/",
"https://github.ur1.fun/",
"https://ghproxy.net/https://github.com/",
"https://gitclone.com/github.com/"
)
# 并行 HEAD 请求,筛选可用镜像
foreach ($m in $gitHubMirrors) {
$req = [System.Net.HttpWebRequest]::Create($m)
$req.Method = "HEAD"
$req.Timeout = 6000
# ...
}逐个尝试可用镜像安装,直到成功。
第四层:权限升级——该要权限时再要
安装脚本的权限策略是:能不要管理员权限就不要,非要不可时再弹出请求。
Windows:逐级升权
尝试用户目录安装 → 失败 →
尝试 UAC 提权(弹窗请求管理员) → 用户拒绝 →
修改启动脚本绕过(Plan C)macOS:osascript 弹出密码框
bash
# 先尝试直接安装
if tar -xzf "$tmp_file" -C /usr/local --strip-components=1; then
return 0 # 成功
fi
# 权限不够,用 osascript 弹出密码输入框
osascript -e "do shell script \"tar -xzf '$tmp_file' -C /usr/local --strip-components=1\" with administrator privileges"Linux:sudo 降级到用户目录
bash
# /usr/local 需要 sudo
sudo tar -xzf "$tmp_file" -C /usr/local --strip-components=1 && return 0
# sudo 也不行(无 root 权限的服务器),装到用户目录
local user_dir="$HOME/.local/node"
mkdir -p "$user_dir"
tar -xzf "$tmp_file" -C "$user_dir" --strip-components=1第五层:幂等性——跑两遍不会出事
好的安装脚本必须支持重复执行。用户可能因为网络中断跑了一半,然后重新执行。
powershell
# 开头就检测是否已安装
$existingVer = (& openclaw -v 2>$null)
if ($existingVer -and -not $script:OpenClawVersion) {
Write-Ok "OpenClaw $existingVer 已安装,无需重复安装"
# 只问要不要重新配置
$reconfig = Read-Host "是否要重新配置 OpenClaw? [y/N]"
if ($reconfig -match "^[Yy]") { Step-Onboard }
return
}PATH 写入也是幂等的——写之前先检查:
powershell
function Add-ToUserPath {
param([string]$Dir)
$currentPath = [Environment]::GetEnvironmentVariable("PATH", "User")
# 已经有了就跳过
if ($currentPath -notlike "*$Dir*") {
[Environment]::SetEnvironmentVariable("PATH", "$Dir;$currentPath", "User")
}
}第六层:进度反馈——让用户知道没卡死
安装依赖可能要几分钟。如果没有任何输出,用户会以为脚本卡死了。
powershell
# 假进度条:安装在子进程跑,主进程显示进度
while (-not $proc.HasExited) {
if ($progress -lt 30) { $progress += 3 }
elseif ($progress -lt 60) { $progress += 2 }
elseif ($progress -lt 90) { $progress += 1 }
$bar = ([string]::new([char]0x2588, $filled)) + ([string]::new([char]0x2591, $empty))
Write-Host "`r 安装进度 [$bar] $progress%" -NoNewline
Start-Sleep -Seconds 1
}这是一个模拟进度条——它不知道实际进度,只是按递减速率增长(前期快、后期慢),给用户心理预期。
如何写自己的一键安装脚本
如果你要给自己的工具写安装脚本,不需要 2000 行。从最简版本开始:
最简 Bash 版(约 50 行)
bash
#!/usr/bin/env bash
set -euo pipefail
REQUIRED_NODE=22
TOOL_NAME="your-tool"
# 1. 检测依赖
if ! command -v node &>/dev/null; then
echo "需要 Node.js,请先安装: https://nodejs.org"
exit 1
fi
node_major=$(node -v | grep -oE '[0-9]+' | head -1)
if (( node_major < REQUIRED_NODE )); then
echo "Node.js 版本过低,需要 v${REQUIRED_NODE}+"
exit 1
fi
# 2. 安装
echo "正在安装 ${TOOL_NAME}..."
npm install -g "$TOOL_NAME"
# 3. 验证
if command -v "$TOOL_NAME" &>/dev/null; then
echo "安装成功: $($TOOL_NAME -v)"
else
echo "安装完成但命令不可用,请检查 PATH"
exit 1
fi逐步增强的维度
从最简版本出发,根据你的用户群体逐步加入:
| 优先级 | 增强项 | 适用场景 | 代码量 |
|---|---|---|---|
| P0 | 依赖检测 + 安装 + 验证 | 所有场景 | ~50 行 |
| P1 | 自动安装缺失依赖 | 用户不是开发者 | +100 行 |
| P2 | 国内镜像源 | 中国用户 | +30 行 |
| P3 | PATH 自动配置 | 非技术用户 | +80 行 |
| P4 | 版本冲突处理 | 开发者用户(装了多版本) | +150 行 |
| P5 | 进度条 + 彩色输出 | 改善体验 | +50 行 |
| P6 | GitHub 镜像降级 | 中国用户 + GitHub 依赖 | +200 行 |
| P7 | Windows 版本 (PowerShell) | 跨平台 | +500 行 |
| P8 | nvm/Homebrew 集成 | 开发者用户 | +200 行 |
| P9 | 权限升级 + 降级 | 多种部署环境 | +100 行 |
curl | bash 的安全隐患
最后说一个经常被忽略的问题。curl | bash 模式意味着你直接执行了一段远程代码,你甚至没机会看到它的内容。
更危险的是,服务器可以通过 User-Agent 检测——当你用 curl 下载时返回正常脚本供你审查,当检测到通过管道传给 bash 时返回恶意代码。
安全建议
更安全的做法是分两步:
bash
# 先下载
curl -fsSL https://example.com/install.sh -o install.sh
# 审查内容
less install.sh
# 确认无误后执行
bash install.sh常见问题(FAQ)
一键安装脚本安全吗?会不会破坏我的系统环境?
成熟的安装脚本会优先写入用户目录而非系统目录,安装前检测已有环境避免覆盖,失败时提供回滚方案。但 curl | bash 模式意味着你在执行未经审查的远程代码,建议先下载脚本审查后再运行。
我想给自己的工具写一键安装脚本,最简版本需要多少行代码?
一个能用的最简版本大约 50-80 行,覆盖依赖检测、下载安装、PATH 配置三步。但要做到生产级健壮性(多平台、多网络环境、版本冲突处理),通常需要 500-2000 行。
为什么安装脚本要同时写 PowerShell 和 Bash 两个版本?
因为 Windows 的 shell 环境和 macOS/Linux 完全不同。PATH 管理机制(注册表 vs 配置文件)、包管理器(winget vs brew/apt)、文件系统权限模型(UAC vs sudo)都不一样,无法用同一个脚本覆盖。
参考来源
- OpenClaw 安装脚本源码(PowerShell 版 + Bash 版)
- npm 文档:全局安装
极拓工坊 专注自动化数据工具,提供知识星球备份、公众号文章导出等产品。 访问 gitapp.net 了解更多。
