github项目地址:scripts/init-openclaw.sh at main · xztjhs/scripts · GitHub

# 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" ]]; then
  echo "❌ 未输入服务器 IP,脚本终止"
  exit 1
fi

# 简单校验 IP 格式
if ! [[ "$SERVER_IP" =~ ^[0-9]{1,3}(\.[0-9]{1,3}){3}$ ]]; then
  echo "❌ IP 格式不合法: $SERVER_IP"
  exit 1
fi
echo "✅ 服务器 IP: $SERVER_IP"

# ---------- 2. Token 处理 ----------
TOKENS_FILE="$HOME/.openclaw/tokens"

if [[ -f "$TOKENS_FILE" ]]; then
  # 读取文件内容(取第一行非空)
  AUTH_TOKEN="$(grep -m1 -v '^$' "$TOKENS_FILE" | tr -d '[:space:]')"
  if [[ -z "$AUTH_TOKEN" ]]; then
    AUTH_TOKEN="$(openssl rand -hex 24)"
    echo "$AUTH_TOKEN" > "$TOKENS_FILE"
    chmod 600 "$TOKENS_FILE"
    echo "✅ tokens 文件为空,已生成新 token 并写入"
  elif [[ ! "$AUTH_TOKEN" =~ ^[0-9a-f]{48}$ ]]; then
    echo "❌ $TOKENS_FILE 首行内容不符合 token 格式(期望 48 位十六进制字符串)"
    echo "❌ 请检查 $TOKENS_FILE 内容"
    exit 1
  else
    echo "✅ 从 $TOKENS_FILE 读取已有 token"
  fi
else
  AUTH_TOKEN="$(openssl rand -hex 24)"
  mkdir -p "$HOME/.openclaw"
  echo "$AUTH_TOKEN" > "$TOKENS_FILE"
  chmod 600 "$TOKENS_FILE"
  echo "✅ tokens 文件不存在,已生成新 token 并写入 $TOKENS_FILE"
fi

# ---------- 3. TLS 证书处理 ----------
TLS_DIR="$HOME/.openclaw/tls"
CERT_FILE="$TLS_DIR/server.crt"
KEY_FILE="$TLS_DIR/server.key"

if [[ -f "$CERT_FILE" && -f "$KEY_FILE" ]]; then
  echo "✅ TLS 证书已存在,利旧: $CERT_FILE / $KEY_FILE"
else
  echo "⚠️  TLS 证书不存在,重新生成..."
  mkdir -p "$TLS_DIR"
  openssl req -x509 \
    -newkey rsa:2048 \
    -keyout "$KEY_FILE" \
    -out "$CERT_FILE" \
    -days 365 \
    -nodes \
    -subj "/CN=openclaw" \
    -addext "subjectAltName=IP:127.0.0.1,IP:${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.auth.token = ***"

openclaw config set gateway.remote.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"
echo "✅ gateway.tls.certPath = $CERT_FILE"

openclaw config set gateway.tls.keyPath "$KEY_FILE"
echo "✅ gateway.tls.keyPath = $KEY_FILE"

openclaw config set gateway.controlUi.allowedOrigins \
  "[\"https://localhost:18789\", \"https://127.0.0.1:18789\", \"https://${SERVER_IP}:18789\"]" \
  --json
echo "✅ gateway.controlUi.allowedOrigins = [localhost, 127.0.0.1, ${SERVER_IP}]"

openclaw config set gateway.trustedProxies '["127.0.0.1", "::1"]'
echo "✅ gateway.trustedProxies = [127.0.0.1, ::1]"

echo ""
echo "========== 配置完成 =========="
echo "服务器 IP:   $SERVER_IP"
echo "Token 文件:  $TOKENS_FILE"
echo "TLS 证书:    $CERT_FILE"
echo "TLS 私钥:    $KEY_FILE"
echo ""
echo "⚠️  记得重启 gateway 使配置生效: openclaw gateway restart"
```

---

## 小结

脚本本身不复杂,但解决了几个实际痛点:

- **重复配置**:10+ 条命令缩成一次交互
- **Token 管理**:不再硬编码,自动生成 + 持久化 + 格式校验
- **证书管理**:利旧优先,避免覆盖已有证书
- **安全**:`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" ]]; then
  echo "❌ 未输入服务器 IP,脚本终止"
  exit 1
fi

# 简单校验 IP 格式
if ! [[ "$SERVER_IP" =~ ^[0-9]{1,3}(\.[0-9]{1,3}){3}$ ]]; then
  echo "❌ IP 格式不合法: $SERVER_IP"
  exit 1
fi
echo "✅ 服务器 IP: $SERVER_IP"

# ---------- 2. Token 处理 ----------
TOKENS_FILE="$HOME/.openclaw/tokens"

if [[ -f "$TOKENS_FILE" ]]; then
  # 读取文件内容(取第一行非空)
  AUTH_TOKEN="$(grep -m1 -v '^$' "$TOKENS_FILE" | tr -d '[:space:]')"
  if [[ -z "$AUTH_TOKEN" ]]; then
    AUTH_TOKEN="$(openssl rand -hex 24)"
    echo "$AUTH_TOKEN" > "$TOKENS_FILE"
    chmod 600 "$TOKENS_FILE"
    echo "✅ tokens 文件为空,已生成新 token 并写入"
  elif [[ ! "$AUTH_TOKEN" =~ ^[0-9a-f]{48}$ ]]; then
    echo "❌ $TOKENS_FILE 首行内容不符合 token 格式(期望 48 位十六进制字符串)"
    echo "❌ 请检查 $TOKENS_FILE 内容"
    exit 1
  else
    echo "✅ 从 $TOKENS_FILE 读取已有 token"
  fi
else
  AUTH_TOKEN="$(openssl rand -hex 24)"
  mkdir -p "$HOME/.openclaw"
  echo "$AUTH_TOKEN" > "$TOKENS_FILE"
  chmod 600 "$TOKENS_FILE"
  echo "✅ tokens 文件不存在,已生成新 token 并写入 $TOKENS_FILE"
fi

# ---------- 3. TLS 证书处理 ----------
TLS_DIR="$HOME/.openclaw/tls"
CERT_FILE="$TLS_DIR/server.crt"
KEY_FILE="$TLS_DIR/server.key"

if [[ -f "$CERT_FILE" && -f "$KEY_FILE" ]]; then
  echo "✅ TLS 证书已存在,利旧: $CERT_FILE / $KEY_FILE"
else
  echo "⚠️  TLS 证书不存在,重新生成..."
  mkdir -p "$TLS_DIR"
  openssl req -x509 \
    -newkey rsa:2048 \
    -keyout "$KEY_FILE" \
    -out "$CERT_FILE" \
    -days 365 \
    -nodes \
    -subj "/CN=openclaw" \
    -addext "subjectAltName=IP:127.0.0.1,IP:${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.auth.token = ***"

openclaw config set gateway.remote.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"
echo "✅ gateway.tls.certPath = $CERT_FILE"

openclaw config set gateway.tls.keyPath "$KEY_FILE"
echo "✅ gateway.tls.keyPath = $KEY_FILE"

openclaw config set gateway.controlUi.allowedOrigins \
  "[\"https://localhost:18789\", \"https://127.0.0.1:18789\", \"https://${SERVER_IP}:18789\"]" \
  --json
echo "✅ gateway.controlUi.allowedOrigins = [localhost, 127.0.0.1, ${SERVER_IP}]"

openclaw config set gateway.trustedProxies '["127.0.0.1", "::1"]'
echo "✅ gateway.trustedProxies = [127.0.0.1, ::1]"

echo ""
echo "========== 配置完成 =========="
echo "服务器 IP:   $SERVER_IP"
echo "Token 文件:  $TOKENS_FILE"
echo "TLS 证书:    $CERT_FILE"
echo "TLS 私钥:    $KEY_FILE"
echo ""
echo "⚠️  记得重启 gateway 使配置生效: openclaw gateway restart"
 

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐