windows+wsl+OpenClaw 安装指南(四):自动化安装脚本完全解析 —— PowerShell 与 Bash 实战

作者:技术实践派
标签:PowerShell | Bash | 自动化脚本 | DevOps | 安装部署
难度:⭐⭐⭐⭐☆(中高级)
阅读时间:20分钟


一、前言

前两篇文章我们了解了 OpenClaw 的快速安装和环境准备。但知其然更要知其所以然—— 自动化脚本到底做了什么?如何根据自己的需求修改脚本?

本文将逐行解析 577 行的 PowerShell 主脚本和 176 行的 Bash 脚本,帮助你:

  • 理解自动化部署的完整流程
  • 学会修改脚本适配自己的环境
  • 掌握 Windows + WSL 混合脚本编写技巧

二、脚本架构总览

2.1 脚本分工

auto-install.bat (入口)
    ↓ 调用
auto-install-openclaw.ps1 (Windows 端主控)
    ├── WSL 环境检查
    ├── 端口转发配置
    ├── 生成 WSL 内部脚本并执行
    │       └── wsl-install.sh (WSL 端执行)
    │           ├── 安装系统依赖
    │           ├── 安装 Node.js 24
    │           ├── 安装 OpenClaw
    │           └── 配置模型和飞书
    └── 验证安装结果

2.2 核心设计思想

  1. 配置驱动:所有可变参数集中在 config.env,脚本只读取执行
  2. 幂等性:重复执行不会出错(检查已安装则跳过)
  3. 错误处理:每个关键步骤都有错误检查和日志记录
  4. 跨环境:Windows 负责网络层,WSL 负责应用层

三、PowerShell 主脚本详解

3.1 脚本头部与参数

# OpenClaw 全自动安装脚本 v3.0
# 以管理员身份运行
# 配置: 腾讯混元大模型 + 飞书集成

param(
    [string]$ConfigFile = "auto-install.config.env"
)

$ErrorActionPreference = "Continue"   # 遇到错误继续执行
$ProgressPreference = "Continue"      # 显示进度条

关键点:

  • param 允许外部传入配置文件路径,方便多环境部署
  • $ErrorActionPreference = "Continue" 确保单步失败不会中断整体流程

3.2 日志系统

$LogFile = "$PSScriptRoot\auto-install-log.txt"

function Write-Log($Message, $Level = "INFO") {
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    $logEntry = "[$timestamp] [$Level] $Message"
    Add-Content -Path $LogFile -Value $logEntry
    
    # 根据级别输出不同颜色
    switch ($Level) {
        "ERROR" { Write-Host $logEntry -ForegroundColor Red }
        "WARN"  { Write-Host $logEntry -ForegroundColor Yellow }
        "OK"    { Write-Host $logEntry -ForegroundColor Green }
        default { Write-Host $logEntry -ForegroundColor Cyan }
    }
}

技巧:统一的日志函数

  • 同时输出到文件和终端
  • 颜色区分级别,便于快速定位问题
  • 时间戳方便事后追溯

3.3 配置文件解析

$config = @{}
Get-Content $configPath | ForEach-Object {
    if ($_ -match '^([^#][^=]*)=(.*)$') {
        $config[$matches[1].Trim()] = $matches[2].Trim()
    }
}

正则解析 env 文件:

  • ^([^#][^=]*):不以 # 开头,且包含非 = 字符的键
  • =(.*)$:等号后的所有内容作为值
  • .Trim():去除首尾空格

3.4 WSL 环境准备

# 检查 WSL 发行版是否存在
$wslStatus = wsl -l -v | Select-String $WslDistro
if (-not $wslStatus) {
    Write-Log "WSL 发行版 $WslDistro 未找到" "ERROR"
    exit 1
}

# 配置 WSL NAT 模式
$wslConfigContent = @"
[wsl2]
networkingMode=NAT
localhostForwarding=true
"@
Set-Content -Path $wslConfigPath -Value $wslConfigContent -Encoding UTF8 -Force

3.5 端口转发自动化

# 获取 WSL IP(使用 awk 确保只取第一个 IP)
$wslIp = wsl -d $WslDistro -e bash -c "hostname -I | cut -d' ' -f1"
$wslIp = $wslIp.Trim()

# 先删除旧规则(避免重复添加报错)
netsh interface portproxy delete v4tov4 listenport=$GatewayPort listenaddress=127.0.0.1 2>$null

# 添加新规则
netsh interface portproxy add v4tov4 `
    listenport=$GatewayPort `
    listenaddress=127.0.0.1 `
    connectport=$GatewayPort `
    connectaddress=$wslIp

关键技巧:

  • 2>$null 将错误输出丢弃(旧规则不存在时的报错)
  • cut -d' ' -f1 确保只取第一个 IP(hostname -I 可能返回多个)

3.6 WSL 内部脚本注入

这是整个脚本最精彩的部分 —— PowerShell 生成 Bash 脚本并传给 WSL 执行:

$depsScript = @"
#!/bin/bash
set -e
export DEBIAN_FRONTEND=noninteractive
export TERM=xterm

echo "[$(date '+%Y-%m-%d %H:%M:%S')] 更新软件包列表..."
sudo apt-get update -qq

echo "[$(date '+%Y-%m-%d %H:%M:%S')] 安装基础依赖..."
sudo apt-get install -y -qq curl wget python3 python3-pip build-essential

echo "[OK] 系统依赖安装完成"
"@

# 写入临时文件
$depsPath = "$env:TEMP\wsl-deps.sh"
$depsScript | Out-File -FilePath $depsPath -Encoding UTF8

# 通过管道传给 WSL bash 执行
Get-Content $depsPath | wsl -d $WslDistro -e bash

为什么不用 wsl -e bash -c "xxx"

因为复杂的 Bash 脚本包含特殊字符(引号、换行等),通过管道传递可以避免转义地狱。


四、WSL Bash 脚本详解

4.1 环境变量设置

#!/bin/bash
set -e  # 遇到错误立即退出

export TERM=xterm                    # 确保有终端输出
export DEBIAN_FRONTEND=noninteractive # apt 不交互
export NPM_CONFIG_REGISTRY=https://registry.npmmirror.com  # 国内镜像

4.2 幂等性设计

# 检查是否已安装 Node.js,且版本正确
if command -v node &> /dev/null; then
    NODE_VERSION=$(node -v)
    if [[ "$NODE_VERSION" == v24* ]]; then
        echo "[OK] Node.js 版本正确,跳过安装"
        exit 0
    fi
fi

**幂等性的好处:**脚本可以安全地重复执行,不会重复安装。

4.3 OpenClaw 安装

# 配置国内 npm 镜像加速
npm config set registry https://registry.npmmirror.com

# 全局安装
npm install -g openclaw@latest

# 创建全局命令链接(确保在 PATH 中)
sudo ln -sf /usr/local/node/bin/openclaw /usr/local/bin/openclaw
sudo ln -sf /usr/local/node/bin/clawhub /usr/local/bin/clawhub
sudo ln -sf /usr/local/node/bin/openclaw-gateway /usr/local/bin/openclaw-gateway

4.4 初始化配置(非交互模式)

if [ ! -d "$HOME/.openclaw" ]; then
    # -e "y\n1" 自动回答 yes 和选择模式 1
    echo -e "y\n1" | openclaw onboard
fi

# 启用 lingering,确保用户服务登录后持续运行
sudo loginctl enable-linger "$USER"

4.5 JSON 配置生成(Python)

OpenClaw 的配置文件是 JSON 格式,使用 Python 处理最方便:

python3 << PYTHON_EOF
import json
import os

config_path = '/home/$USER/.openclaw/openclaw.json'

# 读取现有配置
with open(config_path, 'r') as f:
    config = json.load(f)

# 添加腾讯混元提供商
config['models'] = {
    'providers': {
        'tencent-coding-plan': {
            'baseUrl': 'https://api.lkeap.cloud.tencent.com/coding/v3',
            'apiKey': '$TENCENT_API_KEY',
            'api': 'openai-completions',
            'models': [
                {
                    'id': 'hunyuan-turbos',
                    'name': 'Hunyuan TurboS',
                    'contextWindow': 32000,
                    'maxTokens': 16000
                }
            ]
        }
    }
}

# 设置默认模型
config['agents']['defaults'] = {
    'model': {'primary': 'tencent-coding-plan/hunyuan-turbos'}
}

# 写入配置
with open(config_path, 'w') as f:
    json.dump(config, f, indent=2)

print('配置完成')
PYTHON_EOF

4.6 Systemd 用户服务创建

mkdir -p "$HOME/.config/systemd/user"

cat > "$HOME/.config/systemd/user/openclaw-gateway.service" << 'EOF'
[Unit]
Description=OpenClaw Gateway
After=network.target

[Service]
Type=simple
Environment="PATH=/usr/local/node/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Environment="OPENCLAW_NO_RESPAWN=1"
ExecStart=/usr/local/node/bin/openclaw gateway --port 18789
Restart=always
RestartSec=5

[Install]
WantedBy=default.target
EOF

# 重载 systemd 配置
systemctl --user daemon-reload
systemctl --user enable openclaw-gateway.service

关键配置:

  • Restart=always:服务崩溃后自动重启
  • OPENCLAW_NO_RESPAWN=1:避免与 systemd 重启冲突

五、脚本执行流程图

开始
  │
  ▼
检查管理员权限 ──► 失败 ──► 退出
  │
  ▼
加载配置文件
  │
  ▼
WSL 环境准备 ──► 失败 ──► 退出
  │
  ▼
重启 WSL
  │
  ▼
配置端口转发
  │
  ▼
安装系统依赖 ──► 失败 ──► 退出
  │
  ▼
安装 Node.js 24
  │
  ▼
安装 OpenClaw
  │
  ▼
初始化配置
  │
  ▼
配置大模型
  │
  ├─► 腾讯混元 ──► 生成 JSON 配置
  └─► Ollama ──► 设置 baseUrl
  │
  ▼
配置飞书(可选)
  │
  ▼
配置 Gateway Token
  │
  ▼
创建 Systemd 服务
  │
  ▼
启动 Gateway
  │
  ▼
验证安装 ──► 失败 ──► 查看日志
  │
  ▼
完成,输出访问信息

六、如何修改脚本适配你的环境

6.1 修改默认端口

需求:将默认端口从 18789 改为 8080

修改位置

  1. config.envGATEWAY_PORT=8080
  2. wsl-install.sh 中的 --port 参数
  3. 防火墙规则中的端口

6.2 添加代理支持

如果网络需要代理,在 WSL 脚本中添加:

export http_proxy=http://your-proxy:port
export https_proxy=http://your-proxy:port

6.3 更换模型提供商

除了腾讯混元,还支持其他 OpenAI 兼容接口:

config['models']['providers']['custom'] = {
    'baseUrl': 'https://api.your-provider.com/v1',
    'apiKey': 'your-key',
    'api': 'openai-completions',
    'models': [{'id': 'your-model', 'name': 'Custom Model', 'contextWindow': 32000}]
}

七、完整脚本附件

由于篇幅限制,完整脚本内容已整理为下载文件:

文件名 代码行数 下载
auto-install-openclaw.ps1 577行 下载
wsl-install.sh 176行 下载
auto-install.bat 303行 下载

八、总结

通过本篇文章,我们深入理解了 OpenClaw 自动化安装的完整流程:

知识点 应用场景
PowerShell 调用 WSL Windows + Linux 混合环境管理
管道传递脚本 避免 shell 转义地狱
Python 嵌入 Bash 处理 JSON 配置文件
Systemd 用户服务 用户级守护进程管理
幂等性设计 可重复执行的安装脚本

下篇预告

《windows+wsl+OpenClaw 安装指南(五):大模型配置实战》—— 详细讲解 Ollama 本地部署和腾讯混元 API 配置,包括 RTX 4060 显卡优化参数。


附录:脚本调试技巧

1. 查看详细日志

# PowerShell 端
Get-Content auto-install-log.txt -Wait

# WSL 端
wsl -d Ubuntu-24.04 -e tail -f /tmp/openclaw-install.log

2. 分步执行调试

# 只执行到某一步骤,添加参数
.\auto-install-openclaw.ps1 -StepLimit 5

3. 保留临时脚本

修改脚本,注释掉清理临时文件的代码:

# Remove-Item $depsPath  # 注释掉这行,保留临时脚本用于检查

参考文献

PowerShell 脚本编程

[1] Microsoft. PowerShell 官方文档. https://docs.microsoft.com/zh-cn/powershell/ [EB/OL]. 2024.

[2] Microsoft. PowerShell 脚本编写指南. https://docs.microsoft.com/zh-cn/powershell/scripting/developer/cmdlet/cmdlet-overview [EB/OL]. 2024.

[3] Microsoft. PowerShell 错误处理. https://docs.microsoft.com/zh-cn/powershell/scripting/learn/deep-dives/everything-about-exceptions [EB/OL]. 2024.

[4] Microsoft. about_Preference_Variables. https://docs.microsoft.com/zh-cn/powershell/module/microsoft.powershell.core/about/about_preference_variables [EB/OL]. 2024.

Bash Shell 编程

[5] GNU Bash 参考手册. https://www.gnu.org/software/bash/manual/ [EB/OL]. 2024.

[6] Linux Documentation Project. Advanced Bash-Scripting Guide. https://tldp.org/LDP/abs/html/ [EB/OL]. 2024.

[7] Bash Hackers Wiki. https://wiki.bash-hackers.org/ [EB/OL]. 2024.

Windows 与 WSL 集成

[8] Microsoft. WSL 命令参考. https://docs.microsoft.com/zh-cn/windows/wsl/basic-commands [EB/OL]. 2024.

[9] Microsoft. 从 PowerShell 调用 WSL. https://docs.microsoft.com/zh-cn/windows/wsl/interop [EB/OL]. 2024.

配置管理与部署

[10] Mozilla. 12-Factor App 方法论(中文). https://12factor.net/zh_cn/ [EB/OL]. 2024.

[11] Martin Fowler. Infrastructure as Code. https://martinfowler.com/bliki/InfrastructureAsCode.html [EB/OL]. 2016.

Systemd 服务管理

[12] Red Hat. systemd 服务单元配置. https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/configuring_basic_system_settings/assembly_working-with-systemd-unit-files_configuring-basic-system-settings [EB/OL]. 2024.

[13] DigitalOcean. Understanding Systemd Units and Unit Files. https://www.digitalocean.com/community/tutorials/understanding-systemd-units-and-unit-files [EB/OL]. 2024.

JSON 与配置处理

[14] JSON 官方规范. https://www.json.org/json-zh.html [EB/OL]. 2024.

[15] Python Software Foundation. Python JSON 库文档. https://docs.python.org/3/library/json.html [EB/OL]. 2024.

DevOps 与自动化

[16] GitLab. CI/CD 最佳实践. https://docs.gitlab.com/ee/ci/best_practices/ [EB/OL]. 2024.

[17] Humble, J., & Farley, D. Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation. Addison-Wesley, 2010.


本文完,敬请期待下篇。


系列文章导航:

  • 📎 上一篇:03-环境准备深度指南-WSL网络与依赖配置(待上传后添加链接)
  • 📎 下一篇:05-大模型配置实战-Ollama本地部署与腾讯混元API(待上传后添加链接)
  • 📂 系列目录:windows+wsl+OpenClaw 安装指南

觉得有帮助?

  • 👍 点个赞支持一下
  • ⭐ 收藏备用
  • ✅ 关注博主,不错过后续更新
  • 💬 有问题欢迎在评论区留言
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐