windows+wsl+OpenClaw 安装指南(四):自动化安装脚本完全解析
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 核心设计思想
- 配置驱动:所有可变参数集中在
config.env,脚本只读取执行 - 幂等性:重复执行不会出错(检查已安装则跳过)
- 错误处理:每个关键步骤都有错误检查和日志记录
- 跨环境: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
修改位置:
config.env:GATEWAY_PORT=8080wsl-install.sh中的--port参数- 防火墙规则中的端口
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 安装指南
觉得有帮助?
- 👍 点个赞支持一下
- ⭐ 收藏备用
- ✅ 关注博主,不错过后续更新
- 💬 有问题欢迎在评论区留言
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)