本手册以
小米note3为例 · 无需 Root · 无需买 Mac Mini,
只用安卓手机 + Termux + SSH,小白也可玩转 OpenClaw。
整体部署流程
flowchart TD
START([🚀 开始]) --> PHONE1
subgraph PHONE1 ["📱 手机操作"]
A1[安装 F-Droid 应用商店] --> A2
A2[安装 Termux 套件<br>Termux、Termux:API、Termux:Boot] --> A3
A3[初始化 Termux<br>更新软件包 · 安装基础工具] --> A4
A4[配置 SSH<br>安装 openssh · 设密码 · 查 IP · 启动 sshd]
end
A4 --> SWITCH
SWITCH{{"🔁 切换点<br>手机放下,拿起 Mac/PC<br>后续全部通过 SSH 远程完成"}}
SWITCH --> MAC
subgraph MAC ["💻 Mac/PC 通过 SSH 远程操作"]
B1[SSH 连接手机] --> B2
B2[安装 Ubuntu 虚拟环境] --> B3
B3[安装 Node.js + OpenClaw] --> B4
B4[初始化 OpenClaw 配置] --> B5
B5[修复 Android 兼容性 Patch] --> B6
B6[冒烟测试 Gateway] --> B7
B7[配置飞书渠道] --> B8
B8[生产级稳定性配置<br>watchdog · monitor · tmux · 开机自启] --> B9
B9[安全加固]
end
MAC --> PHONE2
subgraph PHONE2 ["📱 回到手机"]
C1[系统设置<br>关闭电池优化 · 开启自启动] --> C2
C2[重启手机验证]
end
C2 --> DONE([✅ 部署完成!<br>发飞书消息验证])
关于"执行位置"标记
每个操作步骤开头都会标注执行位置:
最容易搞错的地方:
openclaw命令只能在 Ubuntu 环境中运行。在 Termux 里直接输入openclaw会报command not found,这不是安装有问题,是环境不对。
一、准备工作
1.1 硬件要求
Android 10+ 内存 ≥ 4GB
存储剩余 ≥ 2GB 安装包约 200~400MB
1.2 提前准备好以下内容
① AI API 密钥(必须)
OpenClaw 需要调用 AI 模型才能工作。
以 SiliconFlow 为例,国内直连、注册即有免费额度、API 兼容 OpenAI 格式:
1️⃣ 注册账号
访问官网:https://cloud.siliconflow.cn/i/0JKwIJ0l
注册方式:
• 支持邮箱注册
• 支持 GitHub 账号一键登录(推荐,更快)
• 新用户注册即送 2000 万 Token 免费额度
邀请奖励(可选):
• 通过邀请链接注册可获得额外 2000 万 Token
• 邀请好友注册也能获得奖励
───
2️⃣ 获取 API Key
1. 登录后进入控制台:https://cloud.siliconflow.cn/
2. 点击左侧菜单 "API Keys"
3. 点击 "创建新的 API Key"
4. 复制保存好(类似 sk-xxxxxxxx)
───
3️⃣ 查看免费额度
1. 进入控制台首页
2. 可以看到:
• ✅ 剩余 Token 数量
• ✅ 本月用量统计
• ✅ 各模型使用情况
───
4️⃣ 永久免费模型(9B 及以下)
这些模型可以无限使用(有并发限制):
| 模型名称 | 类型 | 用途 |
| --------------------- | ---- | --------- |
| Qwen/Qwen3.5-4B | 语言模型 | 通用对话、简单任务 |
| Qwen/Qwen2.5-Coder-7B | 代码模型 | 编程辅助 |
| Llama-3.2-3B | 语言模型 | 轻量级任务 |
| Gemma-2b-it | 语言模型 | 快速响应 |
───
硅基流动对接openclaw文档:https://docs.siliconflow.cn/cn/usercases/use-siliconcloud-in-OpenClaw
也可以使用其他国内的服务商:DeepSeek(https://platform.deepseek.com)、通义千问(https://dashscope.aliyun.com)、月之暗面 Kimi(https://platform.moonshot.cn)、智谱 GLM(https://open.bigmodel.cn),均支持 OpenAI 兼容接口,步骤类似。
② 飞书开发者账号(如果要用飞书渠道)
需要一个飞书账号,在飞书开放平台创建自建应用。具体步骤见第十节,现在不用操作。
1.3 搞清楚两个命令行环境
全程涉及两个独立的命令行环境,这是最容易混淆的地方:
环境 A:Termux 原生
打开手机上 Termux 应用后直接看到的界面
提示符:
~ $Android 上的 Linux 终端,系统管理命令在这里执行
环境 B:Ubuntu(proot 虚拟系统)
在 Termux 里输入
proot-distro login ubuntu后进入提示符:
root@localhost:~#OpenClaw 安装在这里,所有
openclaw命令必须在这里执行退出回 Termux:输入
exit回车
二、安装 Termux 套件
2.1 安装 F-Droid
执行位置: 手机浏览器
绝对不要从 Google Play 安装 Termux! Play 版本已停止维护超过两年,后续所有步骤都会失败。必须通过 F-Droid 安装。
F-Droid 是什么:专门收录开源 Android 应用的应用商店,免费无广告。
打开手机浏览器,访问 https://f-droid.org
点击「Download F-Droid」,等待
.apk下载完成点击下载的文件安装。若弹出「不允许安装未知来源应用」:
进入 系统设置 → 安全 → 安装未知应用
找到你的浏览器,开启安装权限
返回,重新点击安装
安装完毕后打开 F-Droid,等待软件包列表刷新完成(约 1~2 分钟)
2.2 在 F-Droid 中安装 Termux 套件
执行位置: 手机 · F-Droid 应用
在 F-Droid 搜索框中逐个搜索安装:
Termux:Boot 安装后必须手动打开一次:在应用列表找到 Termux:Boot,点击图标打开一次(会显示空白界面或立即关闭,正常)。不做这步,开机自启动权限不会激活。
三、初始化 Termux 基础环境
执行位置: 手机 · Termux 终端
如何打开 Termux:在手机桌面或应用抽屉找到 Termux 图标,点击打开。首次打开会看到黑色背景终端,提示符为 ~ $。点击终端区域唤出键盘,逐条输入以下命令,每条命令输入完毕按回车执行。
# 更新软件包(需要 2~5 分钟,遇到 [Y/n] 输入 Y 回车)
pkg update && pkg upgrade -y
# 一次性安装所有必要工具:
# proot-distro - 用来安装和运行 Ubuntu 虚拟环境
# openssh - SSH 服务,让 Mac/PC 可以远程连进来
# tmux - 终端复用器,让进程在后台持续运行
# curl wget git - 下载和代码工具
# termux-api - 配合 Termux:API 应用,调用手机系统功能
pkg install proot-distro openssh tmux curl wget git termux-api -y
安装完成后回到 ~ $ 提示符,没有 Error 字样即为成功。
四、配置 SSH — 切换到 Mac/PC 操作
这是整个部署流程的关键切换点。完成本节后,你可以把手机放到一边,后续所有配置都在 Mac/PC 终端里通过 SSH 远程完成,彻底告别手机小键盘。
4.1 手机端:启动 SSH 服务
执行位置: 手机 · Termux 终端(提示符为 ~ $)
# 设置 SSH 登录密码
# 执行后提示 "New password:",输入密码(不显示字符,正常)
# 再次提示 "Retype new password:",再输一遍确认
# 记住这个密码,Mac 第一次连接时要用
passwd
# 查看手机在当前 Wi-Fi 下的 IP 地址
# 直接执行 ifconfig,会显示完整网络接口信息
ifconfig
执行后可能出现
Warning: cannot open /proc/net/dev (Permission denied). Limited output.警告,这在 Termux 里是正常现象,忽略即可,不影响输出结果。
在输出中找到 wlan0 这一段(Wi-Fi 无线网卡),其下方 inet 后面的地址就是你的手机 Wi-Fi IP:
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.19.30.69 netmask 255.255.255.0 broadcast 10.19.30.255
上例中
10.19.30.69就是要记下的手机 IP。后面 SSH 连接、设置别名都要用到这个地址。输出里可能还有
lo(回环)、rmnet_data2(移动数据)、tun0(VPN)等接口,认准wlan0即可。
如果没有显示正常的地址 请依次执行下面的命令安装工具
# 安装查看工具
pkg install iproute2
# 安装后执行查看命令
ip addr# 查看当前 Termux 的用户名(形如 u0_a353,每台手机不同)
whoami
# 启动 SSH 服务(执行后无输出直接回到提示符,说明已在后台运行)
sshd
重要:Termux 的 SSH 端口是 8022,不是默认的 22。连接时必须加
-p 8022。
4.2 Mac / PC 端:连接手机
执行位置: Mac / PC · 终端
如何打开 Mac 终端:按 Command + 空格 打开 Spotlight,输入「终端」,回车。
Windows 用户:打开 PowerShell,或安装 Git Bash。
# 检查是否已有 SSH 密钥(如果输出文件路径,说明有,跳过下一步)
ls ~/.ssh/id_ed25519
如果提示 No such file or directory,先生成密钥:
# 生成 SSH 密钥(一路回车即可,不需要设密码短语)
ssh-keygen -t ed25519 -C "my_mac"
# 将公钥复制到手机,实现免密登录
# 把 u0_a353 替换成你 whoami 得到的用户名
# 把 192.168.1.108 替换成你手机的实际 IP
ssh-copy-id -p 8022 [email protected]
提示输入密码时,输入你刚才在手机 passwd 设置的密码。成功后显示 Number of key(s) added: 1。
# 测试连接(成功后就不再需要密码了)
ssh [email protected] -p 8022
验证成功:终端提示符变为
~ $,说明你已通过 SSH 登录到手机的 Termux 环境。
4.3 设置快捷别名(推荐)
执行位置: Mac · 终端
# 将以下两行添加到 ~/.zshrc(替换用户名和 IP)
echo 'alias phone="ssh [email protected] -p 8022"' >> ~/.zshrc
echo 'alias claw="ssh -t [email protected] -p 8022 \"proot-distro login ubuntu\""' >> ~/.zshrc
# 立即生效
source ~/.zshrc
之后:
输入
phone→ 进入手机 Termux 环境输入
claw→ 直接进入手机的 Ubuntu 环境
IP 变动问题:切换 Wi-Fi 后手机 IP 会变,SSH 失效。解决方法:安装 Tailscale(免费),获得永久固定虚拟 IP,一次配置永久有效。
切换点:手机放下,拿起 Mac/PC
从第五节开始,所有操作都在 Mac/PC 的终端里通过 SSH 完成。
需要回到手机亲自操作的场景只剩两个:
第十三节:手机系统设置(需要手动点击,无法远程)
重启验证:重启手机后等待自启动
五、安装 Ubuntu 虚拟环境
执行位置: Mac · 终端(已 SSH 进入手机 Termux,提示符为 ~ $)
如果还没连接,先执行 phone(或 ssh [email protected] -p 8022)登录手机。
为什么需要 Ubuntu?
OpenClaw 运行时需要向/tmp目录写入临时文件,原生 Android 系统禁止此操作(除非 Root)。通过 proot-distro 运行 Ubuntu 可绕过此限制,完全无需 Root。
# 下载并安装 Ubuntu(约 100~200MB,视网速需要 3~10 分钟)
# 过程中会显示进度条,耐心等待
proot-distro install ubuntu
安装完成后显示类似 Ubuntu installed successfully,回到 ~ $ 提示符。
# 进入 Ubuntu 环境
proot-distro login ubuntu
验证成功:提示符从
~ $变为root@localhost:~#,说明已进入 Ubuntu 虚拟环境。
六、安装 Node.js 和 OpenClaw
执行位置: Mac · 终端(SSH → Ubuntu,提示符为 root@localhost:~#)
如果关闭了终端或断开了 SSH,重新连接后先执行 proot-distro login ubuntu 进入 Ubuntu。
# 更新 Ubuntu 软件包并安装基础编译工具(需要 2~5 分钟)
apt update && apt upgrade -y
apt install -y curl git build-essential
# 添加 Node.js 22 官方安装源
# OpenClaw 要求 Node.js ≥ v22,Ubuntu 默认源里的版本太旧
curl -fsSL https://deb.nodesource.com/setup_22.x | bash -
执行后会看到一大段输出,最后提示 Run apt-get install -y nodejs 即为成功。
# 安装 Node.js
apt install -y nodejs
# 验证版本(必须是 v22.x.x 或更高)
node --version
看到类似 v22.13.1 的输出。如果显示 v18 或更低,说明上一步添加官方源没有成功,需重新执行。
# 安装 OpenClaw(需要几分钟,有 WARN 警告是正常的,只要没有 ERR 就没问题)
npm install -g openclaw@latest
# 安装 OpenClaw 如果配置机器人一直出错换这个版本 卸载open claw教程在文章最后
npm install -g [email protected]
# 验证安装成功(输出版本号即为成功)
openclaw --version
验证成功:输出版本号,如
OpenClaw 2026.3.13 (61d171a)。若提示command not found,确认你在 Ubuntu 环境(root@localhost:~#)而非 Termux(~ $)。
七、初始化 OpenClaw 配置
执行位置: Mac · 终端(SSH → Ubuntu,提示符为 root@localhost:~#)
openclaw onboard
这条命令会启动交互式配置向导,用方向键和回车操作:
问题 1:Continue? (personal mode)
默认光标在「No」,按 左方向键
←切换到「Yes」,再按回车直接回车会选「No」退出向导,需重新执行
问题 2:选择 AI 服务商
用上下方向键选择你的 API Key 对应的服务商(Gemini / OpenAI / Claude 等),回车确认
问题 3:输入 API Key
将 API Key 粘贴进去(Mac 上
Command+V粘贴)输入时屏幕不显示字符,这是正常的安全设计
问题 4:Gateway Bind 地址( 关键!)
必须选 Loopback (127.0.0.1)
绝对不能选
0.0.0.0,会导致 Gateway 启动后立刻崩溃
问题 5:Install daemon
选
--no-daemon或跳过,proot 环境不支持 daemon 模式
如果报错
ERR_SYSTEM_ERROR Unknown system error 13,改用:openclaw onboard --no-daemon
验证成功:向导最后显示
Doctor complete,配置已写入~/.openclaw/openclaw.json。
八、修复 Android proot 兼容性问题
执行位置: Mac · 终端(SSH → Ubuntu,提示符为 root@localhost:~#)
OpenClaw 在 Android proot 环境下有两处系统调用会失败,必须手动修复。
8.1 修复主程序的 networkInterfaces 问题
原因:OpenClaw 调用 os.networkInterfaces() 获取网络接口信息,Android 内核对此调用有限制,会抛出异常导致崩溃。需加 try-catch 保护,失败时返回模拟数据。
# 将 patch 脚本写入临时文件
# 以下是一整段命令,从 cat 开始到 PATCHEOF 结束,全部复制后一次性粘贴并回车
cat > /tmp/patch_networkInterfaces.js << 'PATCHEOF'
const fs = require('fs');
const { execSync } = require('child_process');
const result = execSync(
'grep -rl "pickPrimaryLanIPv4" /usr/lib/node_modules/openclaw/dist/'
).toString().trim();
const file = result.split('\n')[0];
if (!file) { console.error('❌ 未找到目标文件,请确认 openclaw 已正确安装'); process.exit(1); }
console.log('目标文件:' + file);
const content = fs.readFileSync(file, 'utf8');
fs.writeFileSync(file + '.bak', content);
const FALLBACK = '{ lo: [{ address: "127.0.0.1", netmask: "255.0.0.0", family: "IPv4", mac: "00:00:00:00:00:00", internal: true, cidr: "127.0.0.1/8" }], eth0: [{ address: "192.168.1.100", netmask: "255.255.255.0", family: "IPv4", mac: "00:00:00:00:00:01", internal: false, cidr: "192.168.1.100/24" }] }';
let count = 0;
const patched = content.replace(
/\b(const|let|var)\s+(\w+)\s*=\s*os\.networkInterfaces\(\)/g,
(match, decl, varname) => {
count++;
return `${decl} ${varname}; try { ${varname} = os.networkInterfaces(); } catch(e) { ${varname} = ${FALLBACK}; }`;
}
);
fs.writeFileSync(file, patched);
console.log('✅ 已替换 ' + count + ' 处 networkInterfaces 调用');
PATCHEOF
# 执行 patch 脚本
node /tmp/patch_networkInterfaces.js
验证成功:输出
目标文件:/usr/lib/node_modules/...和✅ 已替换 2 处 networkInterfaces 调用。脚本自动定位文件,无需手动指定文件名或行号。备选脚本
直接在 OpenClaw 启动的最入口处,给 Node.js 核心的
os模块套上一个盾。这样不管它里面哪个文件、哪个组件(甚至包括那个烦人的 Bonjour 组件)想要调用安卓内核不支持的网络接口,都会被我们这层盾拦截并返回安全数据。cat > /tmp/global_patch_v3.js << 'PATCHEOF' const fs = require('fs'); const { execSync } = require('child_process'); try { const binSymlink = execSync('which openclaw').toString().trim(); const binPath = fs.realpathSync(binSymlink); console.log('🎯 找到核心入口文件:' + binPath); let content = fs.readFileSync(binPath, 'utf8'); if (content.includes('__proot_patched')) { console.log('✅ 补丁已存在,无需重复注入。'); process.exit(0); } const FALLBACK = '{ lo: [{ address: "127.0.0.1", netmask: "255.0.0.0", family: "IPv4", mac: "00:00:00:00:00:00", internal: true, cidr: "127.0.0.1/8" }], eth0: [{ address: "192.168.1.100", netmask: "255.255.255.0", family: "IPv4", mac: "00:00:00:00:00:01", internal: false, cidr: "192.168.1.100/24" }] }'; const patchCode = ` // --- ANDROID PROOT PATCH --- try { const _os = require('os'); if (!_os.__proot_patched) { const _orig = _os.networkInterfaces; _os.networkInterfaces = function() { try { return _orig.apply(this, arguments); } catch(e) { return ${FALLBACK}; } }; _os.__proot_patched = true; } } catch(e) {} // --- END PATCH --- `; if (content.startsWith('#!')) { const lines = content.split('\n'); lines.splice(1, 0, patchCode); content = lines.join('\n'); } else { content = patchCode + '\n' + content; } fs.writeFileSync(binPath, content); console.log('✅ 全局底层系统调用补丁已成功注入!'); } catch(err) { console.error('❌ 注入失败:', err.message); } PATCHEOF node /tmp/global_patch_v3.js
8.2 修复 Bonjour/mDNS 组件问题
原因:OpenClaw 内嵌的 Bonjour 组件同样调用了 os.networkInterfaces(),需单独修复。
FILE=/usr/lib/node_modules/openclaw/node_modules/@homebridge/ciao/lib/NetworkManager.js
# 确认文件存在(输出文件路径正常;若报 No such file 说明 OpenClaw 安装有问题)
ls $FILE
# 备份(出错可用 cp ${FILE}.bak $FILE 还原)
cp $FILE ${FILE}.bak
# 第一步:将安全函数定义写入临时文件
cat > /tmp/nm_patch.js << 'EOF'
// Android proot patch — injected by SOP setup script
const _origNetIf = require("os").networkInterfaces.bind(require("os"));
const _safeNetIf = () => { try { return _origNetIf(); } catch(e) { return { lo: [{ address: "127.0.0.1", netmask: "255.0.0.0", family: "IPv4", mac: "00:00:00:00:00:00", internal: true, cidr: "127.0.0.1/8" }], eth0: [{ address: "192.168.1.100", netmask: "255.255.255.0", family: "IPv4", mac: "00:00:00:00:00:01", internal: false, cidr: "192.168.1.100/24" }] }; } };
EOF
# 第二步:将函数定义注入到 NetworkManager.js 文件开头
{ cat /tmp/nm_patch.js; cat $FILE; } > /tmp/nm_temp.js && mv /tmp/nm_temp.js $FILE
# 第三步:将所有函数调用替换为安全版本
sed -i 's/os_1\.default\.networkInterfaces()/_safeNetIf()/g' $FILE
# 验证三步均正确完成
echo "=== 文件开头(应看到注入的函数定义)==="
head -3 $FILE
echo "=== _safeNetIf 调用次数(正常应为 5)==="
grep -c '_safeNetIf()' $FILE
验证成功:
head -3第一行是// Android proot patch,grep -c输出5。三步缺一不可:第二步是把函数注入文件,第三步是替换调用,少任何一步运行时会报
_safeNetIf is not defined。
8.3 禁用 Bonjour 避免启动警告
openclaw config set bonjour.enabled false 2>/dev/null || true
如果报错说字段不存在,忽略并继续。Bonjour 报错是非致命的,Gateway 仍正常工作。
九、启动 Gateway(冒烟测试)
执行位置: Mac · 终端(SSH → Ubuntu,提示符为 root@localhost:~#)
本节是冒烟测试:验证 Gateway 能否正常启动。确认成功后按
Ctrl+C停止即可,持久化运行由第十一节的 tmux + watchdog 接管。
openclaw gateway --verbose
验证成功:看到以下输出说明 Gateway 正常:
[gateway] listening on ws://127.0.0.1:18789, ws://[::1]:18789
确认后按 Ctrl+C 停止,继续下一节。
获取 Gateway Token(如果需要)
Gateway 运行时,可用手机浏览器访问 http://localhost:18789 看控制面板。若提示 token missing,另开终端窗口,SSH 进入手机后执行:
proot-distro login ubuntu -- cat ~/.openclaw/openclaw.json | grep token
复制 token 值粘贴到控制面板输入框,点击「连接」。
十、配置飞书渠道
10.1 在飞书开放平台创建自建应用
执行位置: 电脑或手机浏览器
第一步:创建应用
打开 https://open.feishu.cn,登录飞书账号
点击「开发者后台」→「创建自建应用」
填写应用名称(如
OpenClaw Bot)和描述,点击「确认创建」
第二步:添加机器人能力( 关键步骤,漏掉则无法收发消息)
进入刚创建的应用,左侧找到「添加应用能力」
在能力列表中找到「机器人」,点击「添加」并确认
这一步非常容易漏掉。没有添加机器人能力时,应用在飞书中只是普通应用,无法作为聊天机器人接收和回复消息。
第三步:配置权限
左侧点击「权限管理」,在搜索框逐一搜索以下权限并开通:
具体参考权限设置(可直接复制倒入):
{
"scopes": {
"tenant": [
"application:application:self_manage",
"application:bot.menu:write",
"cardkit:card:read",
"cardkit:card:write",
"contact:contact.base:readonly",
"docs:document.comment:create",
"docs:document.comment:delete",
"docs:document.comment:read",
"docs:document.comment:update",
"docs:document.comment:write_only",
"docx:document.block:convert",
"docx:document:create",
"docx:document:readonly",
"docx:document:write_only",
"drive:drive.metadata:readonly",
"im:chat.members:bot_access",
"im:chat:read",
"im:chat:readonly",
"im:chat:update",
"im:message.group_at_msg:readonly",
"im:message.p2p_msg:readonly",
"im:message.pins:read",
"im:message.pins:write_only",
"im:message.reactions:read",
"im:message.reactions:write_only",
"im:message:readonly",
"im:message:recall",
"im:message:send_as_bot",
"im:message:send_multi_users",
"im:message:send_sys_msg",
"im:message:update",
"im:resource"
],
"user": [
"contact:user.employee_id:readonly",
"offline_access"
]
}
}第四步:订阅消息事件
左侧点击「事件与回调 → 事件配置」
选择「使用长连接接收事件」(无需填写回调 URL,OpenClaw 用 WebSocket 长连接)
点击「添加事件」,搜索
im.message.receive_v1,点击确认添加
第五步:记录凭证
左侧点击「凭证与基础信息」,记下:
App ID(形如
cli_xxxxxxxxxxxxxxxx)App Secret(点击「查看」后复制)
第六步:发布应用
左侧点击「应用发布 → 版本管理与发布」,点击「创建版本」,填写版本号后「申请发布」
个人飞书账号:选「创建个人应用」,发布流程相同但无需等管理员审核,立即生效。企业账号如需管理员审核,联系管理员在后台通过即可。
10.2 通过 onboard 向导绑定飞书,并完成账号配对
执行位置: Mac · 终端(SSH → Ubuntu,提示符为 root@localhost:~#)
整体流程说明:绑定飞书分为两个阶段——①通过 onboard 向导填入 App 凭证(让 OpenClaw 知道用哪个飞书应用);②启动 Gateway 后在飞书中触发配对(让 OpenClaw 知道哪个飞书用户是允许的主人)。两个阶段缺一不可。
阶段一:填入飞书 App 凭证
openclaw onboard
向导启动后,选择「飞书(Feishu)」渠道,然后依次输入上一步记下的 App ID 和 App Secret,按回车确认,向导完成后回到命令提示符。
阶段二:启动 Gateway,触发飞书配对
配对需要 Gateway 在运行中才能接收飞书发来的消息。在同一个 Ubuntu 终端里,把 Gateway 临时放到后台运行:
# 将 Gateway 放到后台启动,日志写入临时文件
openclaw gateway > /tmp/openclaw/openclaw.log 2>&1 &
# 等待 3 秒让 Gateway 完全启动
sleep 3
# 确认 Gateway 已在运行(有输出内容表示正常)
tail -5 /tmp/openclaw/openclaw.log
看到
listening on ws://127.0.0.1:18789说明 Gateway 已就绪。
阶段三:在飞书中触发配对消息
切换到手机或电脑的飞书 App
打开飞书,在搜索框搜索你的机器人名称(如
OpenClaw Bot)点击进入私聊,发送任意一条消息(如「你好」)
机器人会自动回复一条包含配对信息的消息,格式如下:
access not configured.
Your Feishu user id: ou_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Pairing code: 12345678
如果机器人没有回复:检查飞书应用是否已发布(10.1 第六步)、是否添加了机器人能力(10.1 第二步)、Gateway 是否在运行(用
tail -5 /tmp/openclaw/openclaw.log确认)。
阶段四:执行配对命令
切换回 Mac 终端(SSH → Ubuntu,提示符为 root@localhost:~#)
把飞书机器人回复消息中的 Pairing code(上例中的 12345678)替换进以下命令执行:
# 将 12345678 替换为飞书机器人回复的实际 Pairing code
openclaw pairing approve feishu 12345678
这条命令的作用:把这个 Pairing code 对应的飞书账号加入 OpenClaw 的授权列表,之后该账号发来的消息才会被正常处理。执行成功后无特别提示,直接回到命令行即可。
阶段五:验证配对成功
# 停止之前的临时 Gateway
pkill -x openclaw-gateway
回到飞书,再次向机器人发送一条消息。如果机器人正常回复(不再出现 access not configured),说明配对完成。
群聊中需要 @机器人 才会响应;私聊直接发消息即可。
Gateway 目前是临时运行的。真正的持久化运行(开机自启、崩溃重启等)由下一节的 watchdog + tmux 接管,现在不用担心。
十一、生产级稳定性配置
以下配置让 OpenClaw 从"手动启动的测试服务"变成真正稳定的 7×24 服务。
执行位置: Mac · 终端(SSH → 手机 Termux,提示符为 ~ $)
如果当前在 Ubuntu(root@localhost:~#),先输入 exit 回到 Termux(~ $)。
本节命令说明:以下使用
proot-distro login ubuntu -- 命令的方式,在 Termux 里直接向 Ubuntu 内部写文件或执行命令,不需要先进入 Ubuntu。
11.1 创建 watchdog 脚本(崩溃自动重启)
proot-distro login ubuntu -- tee /root/watchdog.sh << 'SCRIPT'
#!/bin/bash
LOG=/tmp/openclaw/watchdog.log
mkdir -p /tmp/openclaw
echo "=== Watchdog started at $(date) ===" >> $LOG
while true; do
if ! pgrep -x "openclaw-gateway" > /dev/null 2>&1; then
echo "[$(date)] Gateway not running, restarting..." >> $LOG
openclaw gateway >> /tmp/openclaw/openclaw.log 2>&1 &
disown $!
echo "[$(date)] Gateway restarted PID=$!" >> $LOG
sleep 30
else
echo "[$(date)] Gateway OK PID=$(pgrep -x openclaw-gateway)" >> $LOG
fi
sleep 60
done
SCRIPT
proot-distro login ubuntu -- chmod +x /root/watchdog.sh
watchdog 用
openclaw-gateway检测进程。如果你的版本进程名不同,watchdog 会陷入无限重启循环。可在 Ubuntu 中执行ps aux | grep openclaw确认实际进程名,按需修改脚本。
11.2 创建监控脚本
proot-distro login ubuntu -- tee /root/monitor.sh << 'SCRIPT'
#!/bin/bash
LOG=/tmp/openclaw/monitor.log
mkdir -p /tmp/openclaw
check_gateway() {
if pgrep -x "openclaw-gateway" > /dev/null 2>&1; then echo "ok"; else echo "down"; fi
}
check_port() {
if bash -c 'echo > /dev/tcp/127.0.0.1/18789' 2>/dev/null; then echo "ok"; else echo "down"; fi
}
check_log_size() {
local size=$(du -sm /tmp/openclaw/ 2>/dev/null | cut -f1)
echo "${size:-0}"
}
notify() {
termux-notification --id 2 --title "OpenClaw 告警" --content "$1" --priority high 2>/dev/null || true
echo "[$(date)] ALERT: $1" >> $LOG
}
echo "[$(date)] Monitor started" >> $LOG
while true; do
GATEWAY=$(check_gateway)
PORT=$(check_port)
LOG_SIZE=$(check_log_size)
[ "$GATEWAY" = "down" ] && notify "Gateway 进程已停止,watchdog 正在重启..."
[ "$PORT" = "down" ] && notify "Gateway 端口 18789 无响应"
[ "$LOG_SIZE" -gt 500 ] && notify "日志目录已占用 ${LOG_SIZE}MB,请清理"
echo "[$(date)] gateway=$GATEWAY port=$PORT log=${LOG_SIZE}MB" >> $LOG
sleep 300
done
SCRIPT
proot-distro login ubuntu -- chmod +x /root/monitor.sh
端口检测用 bash 内置的
/dev/tcp方式,比nc命令更可靠(proot 里不一定有 nc)。
11.3 配置日志轮转
# 安装 cron
proot-distro login ubuntu -- apt install -y cron
# 创建日志轮转脚本
proot-distro login ubuntu -- tee /root/logrotate.sh << 'SCRIPT'
#!/bin/bash
LOG_DIR=/tmp/openclaw
MAX_SIZE_MB=200
size=$(du -sm $LOG_DIR 2>/dev/null | cut -f1)
if [ "${size:-0}" -gt $MAX_SIZE_MB ]; then
echo "[$(date)] Rotating logs (${size}MB)..." >> $LOG_DIR/rotate.log
find $LOG_DIR -name "openclaw-*.log" -mtime +3 -delete
echo "[$(date)] Done. New size: $(du -sm $LOG_DIR | cut -f1)MB" >> $LOG_DIR/rotate.log
fi
SCRIPT
proot-distro login ubuntu -- chmod +x /root/logrotate.sh
# 设置每天凌晨 3 点自动执行
proot-distro login ubuntu -- bash -c '(crontab -l 2>/dev/null; echo "0 3 * * * bash /root/logrotate.sh") | crontab -'
# 启动 cron(直接调用,兼容无 init 系统的 proot 环境)
proot-distro login ubuntu -- cron
11.4 用 tmux 启动持久服务
# 创建 openclaw tmux 会话并启动 watchdog
# watchdog 启动后会自动负责启动和守护 Gateway
tmux new-session -d -s openclaw
tmux send-keys -t openclaw "proot-distro login ubuntu -- bash /root/watchdog.sh" Enter
# 新建第二个窗口运行监控脚本
tmux new-window -t openclaw -n monitor
tmux send-keys -t openclaw:monitor "proot-distro login ubuntu -- bash /root/monitor.sh" Enter
# 确认两个窗口都在运行
tmux ls
tmux list-windows -t openclaw
输出示例:
openclaw: 2 windows (created ...)
0: bash* (1 panes)
1: monitor- (1 panes)
想查看实时日志:执行
tmux attach -t openclaw,按Ctrl+B再按D可退出而不关闭进程。不要用
nohup ... &在 proot 环境后台运行长期进程,proot session 退出后进程随即终止。必须用 tmux 保持持久会话。
11.5 配置开机自启动
# 确保启动脚本目录存在
mkdir -p ~/.termux/boot
# 脚本一:开机自动启动 SSH
cat > ~/.termux/boot/start-ssh.sh << 'EOF'
#!/data/data/com.termux/files/usr/bin/bash
sshd
EOF
chmod +x ~/.termux/boot/start-ssh.sh
# 脚本二:开机自动启动 OpenClaw 全套服务
cat > ~/.termux/boot/start-openclaw.sh << 'EOF'
#!/data/data/com.termux/files/usr/bin/bash
# 防止系统杀死 Termux 进程
termux-wake-lock &
# 等待 Android 系统完全启动(15 秒)
sleep 15
# 启动 cron(日志轮转)
proot-distro login ubuntu -- cron
# 启动 watchdog(守护 Gateway)
tmux new-session -d -s openclaw
tmux send-keys -t openclaw "proot-distro login ubuntu -- bash /root/watchdog.sh" Enter
# 等待第一个窗口就绪
sleep 3
tmux new-window -t openclaw -n monitor
tmux send-keys -t openclaw:monitor "proot-distro login ubuntu -- bash /root/monitor.sh" Enter
# 常驻通知,方便确认服务在运行
sleep 5
termux-notification \
--id 1 \
--title "OpenClaw Running" \
--content "Gateway + watchdog + monitor active" \
--ongoing
EOF
chmod +x ~/.termux/boot/start-openclaw.sh
# 确认两个脚本都已创建
ls -la ~/.termux/boot/
输出应包含 start-ssh.sh 和 start-openclaw.sh。
十二、安全加固
执行位置: Mac · 终端(SSH → 手机 Termux,提示符为 ~ $)
你的飞书 User ID 在第十节机器人第一次回复中已经告知,格式为 ou_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx。
# 配置飞书白名单:只处理你自己发来的消息
# 将 ou_你的飞书user_id 替换为实际 User ID
proot-distro login ubuntu -- openclaw config set channels.feishu.allowFrom '["ou_你的飞书user_id"]'
proot-distro login ubuntu -- openclaw config set channels.feishu.groupAllowFrom '["ou_你的飞书user_id"]'
# 关闭高风险的文档创建权限(防止 AI 误操作)
proot-distro login ubuntu -- openclaw config set channels.feishu.tools.doc false
# 允许飞书插件(消除启动警告)
proot-distro login ubuntu -- openclaw config set plugins.allow '["feishu"]'
# 查看安全审计(目标:CRITICAL = 0)
proot-distro login ubuntu -- openclaw security audit
# 重启 Gateway 使配置生效(watchdog 约 60 秒后自动重启)
proot-distro login ubuntu -- pkill -x openclaw-gateway
sleep 70
proot-distro login ubuntu -- tail -5 /tmp/openclaw/watchdog.log
日志末尾应有 Gateway restarted PID=XXXX,说明重启成功。
十三、回到手机:系统设置
执行位置: 手机 · 系统设置(这是本教程第二次需要拿起手机)
这步很多人会漏掉,漏掉后的症状:手机重启或锁屏一段时间后,OpenClaw 停止响应,SSH 无法连接。
OnePlus / OxygenOS:
设置 → 电池 → 应用电池用量 → Termux → 不限制
设置 → 应用 → 应用管理 → Termux → 电池 → 无限制
设置 → 安全 → 自启动管理 → Termux → 开启
打开「最近任务」,长按 Termux 卡片,点击锁定图标()
其他品牌:在系统设置搜索「自启动」或「电池优化」,找到 Termux 关闭后台限制并开启自启动。各品牌参考路径:
小米 / MIUI:设置 → 应用设置 → 授权管理 → 自启动 → Termux 开启;设置 → 电量与性能 → 省电优化 → Termux → 无限制
三星 / One UI:设置 → 电池 → 后台使用限制 → 从不休眠的应用 → 添加 Termux
华为 / HarmonyOS:设置 → 应用 → 应用启动管理 → Termux → 手动管理,三项全开
十四、常用命令速查
执行位置: Mac · 终端(SSH → 手机 Termux,提示符为 ~ $)
# 进入 Ubuntu 环境(需要多步 Ubuntu 操作时)
proot-distro login ubuntu
# 查看 OpenClaw 状态
proot-distro login ubuntu -- openclaw status
# 查看 watchdog 日志(最近 20 条)
proot-distro login ubuntu -- tail -20 /tmp/openclaw/watchdog.log
# 查看监控日志(最近 20 条)
proot-distro login ubuntu -- tail -20 /tmp/openclaw/monitor.log
# 查看 Gateway 运行日志(最近 50 条)
proot-distro login ubuntu -- tail -50 /tmp/openclaw/openclaw.log
# 手动重启 Gateway(watchdog 60 秒内自动恢复)
proot-distro login ubuntu -- pkill -x openclaw-gateway
# 查看 tmux 会话和窗口
tmux ls
tmux list-windows -t openclaw
# 进入 tmux 查看实时日志(Ctrl+B 再按 D 退出,不关闭进程)
tmux attach -t openclaw
# 查看手机当前 IP
ifconfig | grep 'inet '
# 手动启动 SSH(自启动配置前,重启手机后需要先到手机上执行此命令)
sshd
十五、常见问题排查
最终验证:完成所有配置后,重启手机,等待约 1 分钟,通过飞书发消息给机器人。收到正常回复,说明整个系统已完全自动化运行
如果重启后不响应:
查手机通知栏是否有「OpenClaw Running」常驻通知 → 有则查 watchdog 日志定位问题
没有通知 → 检查第十三节系统设置是否完成
没问题,咱们把刚才对付那个顽固软件的“物理超度”全家桶整理出来。
如果你以后再遇到类似的 npm 全局包卸载不干净、或者配置文件卡死的情况,直接按顺序打出这套组合拳,保证清理得一尘不染:
OpenClaw 彻底卸载与清理指令
1. 卸载 npm 全局包
首先通过包管理器执行标准的卸载流程。
Bash
npm uninstall -g openclaw
2. 暴力清除残留安装目录 (解决 ENOTEMPTY 报错)
如果 npm 卸载时因为权限或幽灵文件卡住(就像刚才那样),直接去它的老巢把文件夹连根拔起,顺便把临时垃圾文件也干掉。
Bash
rm -rf /usr/lib/node_modules/openclaw
rm -rf /usr/lib/node_modules/.openclaw-*
3. 抹除所有用户配置与本地数据
这一步最关键。OpenClaw 会在你的用户目录下生成隐藏文件夹,里面藏着那个死活不更新的 models.yaml 和各种缓存日志。把它删掉,软件就会彻底“失忆”。
Bash
rm -rf ~/.openclaw
4. 清理 npm 缓存 (防玄学)
最后给 npm 洗个澡,防止它下次安装其他东西时又抽风。
Bash
npm cache clean --force
💡 避坑小贴士:
如果你在卸载后想验证是否清理干净了,可以输入
openclaw --version。如果终端提示command not found,就说明这套环境已经彻底纯净了。
转载来自作者:Ethan Blaze https://linux.do/t/topic/179352
评论