# OpenClaw 一键初始化脚本:从零到上线就一条命令
## 背景
OpenClaw 是一个开源的 AI Agent 框架,部署在自己的服务器上,通过 Gateway 提供服务。但每次新装一台机器,都要手动跑十来条 `openclaw config set`,还要处理 TLS 证书、认证 token、可信 IP 白名单……繁琐且容易出错。
于是写了个 bash 脚本 `init-openclaw.sh`,一条命令完成全部初始化配置。
---
## 脚本做了什么
按顺序完成 4 件事:
### 1. 交互式输入服务器 IP
脚本启动后提示输入服务器 IP,强制校验格式(IPv4 四段式)。留空直接终止,不给默认值——防止误配到错误地址。
``` 请输入服务器 IP: 192.168.254.196 ✅ 服务器 IP: 192.168.254.196 ```
### 2. Token 自动管理
认证 token 的处理逻辑:
- `~/.openclaw/tokens` **存在** → 读取首行,校验是否为 48 位十六进制字符串(`openssl rand -hex 24` 的标准输出格式)。格式不对直接终止,提示人工检查。 - `~/.openclaw/tokens` **不存在** → 自动生成新 token,写入文件,权限设为 `600`。 - 文件存在但**内容为空** → 同上,生成新 token 并写入。
这个 token 会同时设置到 `gateway.auth.token` 和 `gateway.remote.token`,客户端连接时用同一个。
### 3. TLS 证书利旧或新建
检查 `~/.openclaw/tls/server.crt` 和 `~/.openclaw/tls/server.key`:
- **都存在** → 直接利旧,跳过生成步骤 - **任一不存在** → 用 `openssl req -x509` 生成自签证书,SAN 包含 `127.0.0.1` 和输入的服务器 IP,有效期 365 天
### 4. 执行 OpenClaw 配置
按顺序执行以下配置项,IP 和 token 全程通过变量替换:
| 配置项 | 值 | |---|---| | `gateway.mode` | `local` | | `gateway.bind` | `lan` | | `gateway.auth.token` | 从 tokens 文件读取或自动生成 | | `gateway.remote.token` | 同上 | | `gateway.tls.enabled` | `true` | | `gateway.tls.autoGenerate` | `false` | | `gateway.tls.certPath` | `~/.openclaw/tls/server.crt` | | `gateway.tls.keyPath` | `~/.openclaw/tls/server.key` | | `gateway.controlUi.allowedOrigins` | `localhost`、`127.0.0.1`、输入IP 三者 的 `https://*:18789` | | `gateway.trustedProxies` | `["127.0.0.1", "::1"]` |
---
## 使用方法
### 前置条件
- 已安装 `openclaw` CLI 并在 PATH 中 - 已安装 `openssl` - 对 `~/.openclaw/` 目录有读写权限
### 运行
```bash bash init-openclaw.sh ```
### 典型输出
``` 请输入服务器 IP: 192.168.254.196 ✅ 服务器 IP: 192.168.254.196 ✅ tokens 文件不存在,已生成新 token 并写入 /home/user/.openclaw/tokens ✅ TLS 证书已生成
========== 开始配置 OpenClaw ========== ✅ gateway.mode = local ✅ gateway.bind = lan ✅ gateway.auth.token = *** ✅ gateway.remote.token = *** ✅ gateway.tls.enabled = true ✅ gateway.tls.autoGenerate = false ✅ gateway.tls.certPath = /home/user/.openclaw/tls/server.crt ✅ gateway.tls.keyPath = /home/user/.openclaw/tls/server.key ✅ gateway.controlUi.allowedOrigins = [localhost, 127.0.0.1, 192.168.254.196] ✅ gateway.trustedProxies = [127.0.0.1, ::1]
========== 配置完成 ========== 服务器 IP: 192.168.254.196 Token 文件: /home/user/.openclaw/tokens TLS 证书: /home/user/.openclaw/tls/server.crt TLS 私钥: /home/user/.openclaw/tls/server.key
⚠️ 记得重启 gateway 使配置生效: openclaw gateway restart ```
最后重启 Gateway 即可:
```bash openclaw gateway restart ```
---
## 安全设计说明
- **Token 文件权限 600**:只有文件所有者可读写,防止其他用户窃取 - **Token 格式校验**:48 位十六进制,防止误写入随意内容导致认证异常 - **TLS 证书利旧**:已有证书不会被覆盖,方便迁移和批量部署 - **`set -euo pipefail`**:脚本遇到任何错误立即停止,不会带着错误继续往下跑
---
## 完整脚本
```bash #!/usr/bin/env bash set -euo pipefail
# ============================================================ # OpenClaw 初始化脚本 # 用法: bash init-openclaw.sh # ============================================================
# ---------- 1. 输入服务器 IP ---------- read -rp "请输入服务器 IP: " SERVER_IP
if [[ -z "SERVER_IP" =~ ^[0-9]{1,3}(\.[0-9]{1,3}){3}$ ]]; then echo "❌ IP 格式不合法: $SERVER_IP" exit 1 fi echo "✅ 服务器 IP: HOME/.openclaw/tokens"
if [[ -f "(grep -m1 -v '^$' "$TOKENS_FILE" | tr -d '[:space:]')" if [[ -z "(openssl rand -hex 24)" echo "TOKENS_FILE" chmod 600 "AUTH_TOKEN" =~ ^[0-9a-f]{48}$ ]]; then echo "❌ $TOKENS_FILE 首行内容不符合 token 格式(期望 48 位十六进制字符串)" echo "❌ 请检查 TOKENS_FILE 读取已有 token" fi else AUTH_TOKEN="$(openssl rand -hex 24)" mkdir -p "$HOME/.openclaw" echo "TOKENS_FILE" chmod 600 "TOKENS_FILE" fi
# ---------- 3. TLS 证书处理 ---------- TLS_DIR="TLS_DIR/server.crt" KEY_FILE="CERT_FILE" && -f "CERT_FILE / TLS_DIR" openssl req -x509 \ -newkey rsa:2048 \ -keyout "CERT_FILE" \ -days 365 \ -nodes \ -subj "/CN=openclaw" \ -addext "subjectAltName=IP:127.0.0.1,IP:AUTH_TOKEN" echo "✅ gateway.auth.token = ***"
openclaw config set gateway.remote.token "CERT_FILE" echo "✅ gateway.tls.certPath = KEY_FILE" echo "✅ gateway.tls.keyPath = {SERVER_IP}:18789\"]" \ --json echo "✅ gateway.controlUi.allowedOrigins = [localhost, 127.0.0.1, SERVER_IP" echo "Token 文件: CERT_FILE" echo "TLS 私钥: SERVER_IP" ]]; then echo "❌ 未输入服务器 IP,脚本终止" exit 1 fi
# 简单校验 IP 格式 if ! [[ " ]]; then echo "❌ IP 格式不合法: SERVER_IP"
# ---------- 2. Token 处理 ---------- TOKENS_FILE="$HOME/.openclaw/tokens"
if [[ -f "$TOKENS_FILE" ]]; then # 读取文件内容(取第一行非空) AUTH_TOKEN="' "AUTH_TOKEN" ]]; then AUTH_TOKEN="$(openssl rand -hex 24)" echo "$AUTH_TOKEN" > "TOKENS_FILE" echo "✅ tokens 文件为空,已生成新 token 并写入" elif [[ ! " ]]; then echo "❌ TOKENS_FILE 内容" exit 1 else echo "✅ 从 (openssl rand -hex 24)" mkdir -p "$HOME/.openclaw" echo "$AUTH_TOKEN" > "TOKENS_FILE" echo "✅ tokens 文件不存在,已生成新 token 并写入 HOME/.openclaw/tls" CERT_FILE="TLS_DIR/server.key"
if [[ -f "KEY_FILE" ]]; then echo "✅ TLS 证书已存在,利旧: KEY_FILE" else echo "⚠️ TLS 证书不存在,重新生成..." mkdir -p "KEY_FILE" \ -out "{SERVER_IP}" echo "✅ TLS 证书已生成" fi
# ---------- 4. 执行 OpenClaw 配置 ---------- echo "" echo "========== 开始配置 OpenClaw =========="
openclaw config set gateway.mode local echo "✅ gateway.mode = local"
openclaw config set gateway.bind lan echo "✅ gateway.bind = lan"
openclaw config set gateway.auth.token "AUTH_TOKEN" echo "✅ gateway.remote.token = ***"
openclaw config set gateway.tls.enabled true echo "✅ gateway.tls.enabled = true"
openclaw config set gateway.tls.autoGenerate false echo "✅ gateway.tls.autoGenerate = false"
openclaw config set gateway.tls.certPath "CERT_FILE"
openclaw config set gateway.tls.keyPath "KEY_FILE"
openclaw config set gateway.controlUi.allowedOrigins \ "[\"https://localhost:18789\", \"https://127.0.0.1:18789\", \"https://{SERVER_IP}]"
openclaw config set gateway.trustedProxies '["127.0.0.1", "::1"]' echo "✅ gateway.trustedProxies = [127.0.0.1, ::1]"
echo "" echo "========== 配置完成 ==========" echo "服务器 IP: TOKENS_FILE" echo "TLS 证书: KEY_FILE" echo "" echo "⚠️ 记得重启 gateway 使配置生效: openclaw gateway restart"
夜雨聆风