Skip to content

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.3

Windows

打开 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 行
P3PATH 自动配置非技术用户+80 行
P4版本冲突处理开发者用户(装了多版本)+150 行
P5进度条 + 彩色输出改善体验+50 行
P6GitHub 镜像降级中国用户 + GitHub 依赖+200 行
P7Windows 版本 (PowerShell)跨平台+500 行
P8nvm/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)都不一样,无法用同一个脚本覆盖。


参考来源

  1. OpenClaw 安装脚本源码(PowerShell 版 + Bash 版)
  2. npm 文档:全局安装

极拓工坊 专注自动化数据工具,提供知识星球备份、公众号文章导出等产品。 访问 gitapp.net 了解更多。