在aws的e2c服务上部署openclaw
TigerVNC 用于远程桌面访问;VNC 协议本身并不是为互联网环境设计的,如果直接将 VNC 端口暴露在公网,服务器很容易被自动扫描工具发现,并遭遇暴力破解攻击。当浏览器通过 --remote-debugging-port=9222 启动后,OpenClaw 就可以通过 Chrome DevTools Protocol 接管浏览器并执行自动化任务,例如发布推文、浏览时间线或执行其他网页操作。在
1 背景与目标
1.1 为什么需要远程浏览器环境
在构建基于 Agent 的自动化系统时,浏览器往往是任务执行的重要入口。许多操作并没有稳定的 API 接口,例如社交媒体发帖、页面交互、账号管理等,这些行为通常需要通过浏览器完成。
在 OpenClaw 的使用场景中,Agent 会通过浏览器执行一系列操作,例如打开 Twitter 页面、输入推文内容并发布。这种方式本质上是模拟真实用户行为,而不是直接调用平台接口。
如果在本地电脑上运行浏览器自动化,短时间内是可行的,但长期运行会面临一些现实问题,例如:
• 本地机器需要持续开机
• 浏览器环境容易被打断
• 自动化流程难以长期稳定运行
因此,更合理的方式是将浏览器运行环境迁移到云服务器上,使其可以长期稳定运行。
但问题也随之出现:大多数云服务器(例如 AWS EC2)默认只提供 命令行环境,并没有图形界面。换句话说,服务器上虽然可以运行程序,但并不能像普通电脑一样打开浏览器窗口。
为了让浏览器能够在服务器上运行,并且可以被远程控制,就需要构建一个 远程浏览器环境。
⸻
1.2 OpenClaw 的运行方式
OpenClaw 本质上是一个 Agent 系统,它负责根据任务指令执行一系列操作,而浏览器则是这些操作的执行载体。
在实际运行过程中,OpenClaw 会:
1. 启动浏览器环境
2. 访问目标网站
3. 执行页面操作(例如输入、点击等)
4. 完成任务,例如发布推文
这种模式意味着浏览器需要具备几个重要特征:
• 能够长期运行
• 保持账号登录状态
• 在出现问题时可以进行人工干预
如果浏览器完全运行在 headless 模式下,一旦自动化流程出现问题,调试难度会明显增加。因此,在很多 Agent 项目中,开发者更倾向于使用 真实浏览器环境 来运行自动化任务。
⸻
1.3 为什么不直接使用 Headless Browser
在浏览器自动化领域,一个常见方案是使用 Headless Browser,例如 Puppeteer 或 Playwright 启动 headless Chrome。
Headless 模式下浏览器没有图形界面,可以直接在服务器后台运行,这在很多自动化任务中都非常高效。
然而在实际使用中,这种方式也存在一些局限:
• 一些网站会检测 headless 浏览器
• 登录状态和 Cookie 管理更复杂
• 页面行为异常时难以调试
对于像 Twitter(X)这样的社交平台来说,浏览器环境越接近真实用户环境,稳定性通常越高。
因此,与其使用完全无界面的浏览器,不如在服务器上运行一个 真实的桌面环境 + 浏览器。
⸻
1.4 整体架构说明
为了实现远程浏览器运行环境,需要构建一个简单的远程访问架构。
整体结构如下:
Mac 本地电脑
│
SSH Tunnel
│
AWS EC2
│
TigerVNC Server
│
Linux Desktop
│
Chrome Browser
│
OpenClaw
在这个架构中:
• AWS EC2 提供服务器运行环境
• Linux Desktop 提供图形桌面
• TigerVNC 提供远程桌面访问能力
• SSH Tunnel 用于安全连接
• 本地电脑 作为远程控制端
通过这种方式,服务器就像一台始终在线的远程电脑,浏览器可以在其中长期运行,而开发者可以在需要时远程连接进行操作。
⸻
1.5 最终实现目标
完成环境搭建后,系统应该具备以下能力:
• 云服务器可以长期运行浏览器
• 浏览器能够保持账号登录状态
• 本地电脑可以随时远程控制服务器桌面
• OpenClaw 可以直接操作浏览器执行任务
换句话说,我们最终得到的是一个 云端长期运行的浏览器环境,既可以支持自动化任务,也可以在需要时进行人工控制。
2 服务器端环境搭建(AWS EC2)
在完成整体架构设计之后,下一步是在服务器上构建实际运行环境。本节的目标是把一台默认只有命令行的 Ubuntu 服务器,逐步变成一台可以运行浏览器并支持远程访问的 Linux 桌面环境。
整个过程包括几个主要步骤:创建 EC2 实例、安装 Linux 桌面环境、配置远程桌面服务,以及安装浏览器环境。完成这些步骤后,服务器就可以作为一个长期在线的浏览器运行节点,为 OpenClaw 提供稳定的执行环境。
⸻
2.1 创建 AWS EC2 实例
首先需要在 AWS 上创建一台 EC2 实例作为运行环境。由于需要运行桌面环境和浏览器,建议至少使用 2 vCPU + 4GB RAM 的配置,例如 t3.medium 或 t3.large。
系统镜像建议选择 Ubuntu 22.04 LTS,该版本在桌面环境和远程桌面工具方面兼容性较好。
实例启动后,可以通过 SSH 连接服务器:
ssh -i your-key.pem ubuntu@your-ec2-ip
连接成功后,建议先更新系统软件包:
sudo apt update
sudo apt upgrade -y
此时服务器仍然是一个纯命令行环境。
2.2 安装 Linux 桌面环境
云服务器默认没有图形界面,因此需要手动安装桌面环境。为了减少资源占用,这里选择 XFCE 桌面环境。
安装命令如下:
sudo apt install xfce4 xfce4-goodies -y
安装完成后,系统就具备了基本的桌面组件,例如窗口管理器、文件管理器以及终端程序。
不过服务器仍然无法直接显示桌面,因为没有连接显示器。为了远程访问桌面,需要配置远程桌面服务。
⸻
2.3 安装远程桌面服务(TigerVNC)
为了远程访问服务器桌面,需要安装一个 VNC Server。这里使用 TigerVNC。
安装命令:
sudo apt install tigervnc-standalone-server tigervnc-common -y
安装完成后,初始化 VNC Server:
vncserver
第一次运行时系统会要求设置 VNC 访问密码。
初始化完成后,可以先停止 VNC 会话以进行配置:
vncserver -kill :1
2.4 配置 VNC Session
为了让 VNC 启动时加载 XFCE 桌面,需要配置启动脚本。
编辑配置文件:
nano ~/.vnc/xstartup
写入以下内容:
#!/bin/bash
xrdb $HOME/.Xresources
startxfce4 &
然后赋予执行权限:
chmod +x ~/.vnc/xstartup
重新启动 VNC Server:
vncserver :1 -geometry 1920x1080 -depth 24
此时服务器已经启动一个远程桌面会话,对应端口 5901。
2.5 安装 Chromium 浏览器(snap)
在 Ubuntu 22.04 之后,Chromium 浏览器通常通过 snap 包管理器进行安装。snap 是 Ubuntu 的一种容器化软件安装方式,每个应用都会包含完整依赖,并运行在沙盒环境中。
安装 Chromium:
sudo snap install chromium
安装完成后,Chromium 的可执行文件路径通常为:
/snap/bin/chromium
这种方式安装的浏览器与系统环境隔离度更高,在某些自动化场景下反而更稳定。
⸻
2.6 在 VNC 桌面中启动浏览器
由于浏览器需要在 VNC 桌面中运行,需要指定正确的 DISPLAY 环境变量。
首先允许本地程序访问 VNC 桌面:
DISPLAY=:1 xhost +local:
然后启动 Chromium,并开启远程调试端口:
DISPLAY=:1 /snap/bin/chromium \
--remote-debugging-port=9222 \
https://x.com/login &
这条命令包含几个关键参数:
• DISPLAY=:1
指定浏览器在 VNC 桌面上显示窗口
• --remote-debugging-port=9222
开启 Chrome DevTools 调试端口,允许自动化程序接管浏览器
• https://x.com/login
直接打开 Twitter 登录页面
浏览器启动后,可以在 VNC 桌面中看到 Chromium 窗口,并手动完成账号登录。登录成功后,OpenClaw 就可以通过 9222 调试端口接管这个浏览器实例并执行自动化任务。
完成以上步骤后,服务器已经具备以下能力:
• 运行 Linux 图形桌面环境
• 提供 VNC 远程桌面服务
• 在桌面中运行 Chromium 浏览器
• 开启 DevTools 调试端口供 OpenClaw 接管
至此,一台普通的 Ubuntu 云服务器已经被改造成一个可以远程控制的浏览器运行环境。
3 安全访问方案设计(SSH Tunnel)
在服务器端完成桌面环境和 VNC 服务的配置之后,下一步就是从本地电脑连接到服务器桌面。最直接的做法是开放 VNC 端口(例如 5901)并让客户端直接连接,但这种方式在公网环境下存在明显的安全风险。
VNC 协议本身并不是为互联网环境设计的,如果直接将 VNC 端口暴露在公网,服务器很容易被自动扫描工具发现,并遭遇暴力破解攻击。因此,在实际部署中通常不会直接开放 VNC 端口,而是通过 SSH Tunnel(SSH 隧道) 来访问远程桌面。
SSH Tunnel 的原理其实很简单:通过 SSH 建立一条加密连接,并把本地端口映射到远程服务器的某个端口。这样在本地访问某个端口时,数据会通过 SSH 连接转发到服务器,从而实现安全访问。
在本项目的架构中,VNC Server 通常运行在服务器的 5901 端口(对应 display :1)。我们可以在本地电脑上创建一个 SSH 隧道,把本地端口映射到这个远程端口。
⸻
3.1 SSH Tunnel 原理
整体数据流可以理解为下面的结构:
本地 Mac
│
localhost:5901
│
SSH Tunnel
│
AWS EC2
│
localhost:5901
│
TigerVNC Server
从客户端的角度看,只需要连接 localhost:5901,但实际上数据已经通过 SSH 安全地转发到了服务器上的 VNC 服务。
这种方式有两个明显优势:
• VNC 端口不需要对公网开放
• 所有数据通过 SSH 加密传输
因此服务器的安全组只需要开放 22 端口(SSH) 即可。
⸻
3.2 创建 SSH Tunnel
在本地电脑上执行以下命令即可创建 SSH 隧道:
ssh -i your-key.pem -L 5901:localhost:5901 ubuntu@your-ec2-ip
这条命令包含几个关键部分:
• -L 5901:localhost:5901
将本地端口 5901 转发到服务器的 localhost:5901
• ubuntu@your-ec2-ip
服务器的登录地址
• -i your-key.pem
AWS EC2 使用的 SSH 密钥
当这条命令执行成功后,本地电脑的 5901 端口 就已经连接到服务器上的 VNC 服务。
此时不要关闭这个 SSH 终端,因为 SSH Tunnel 需要保持连接状态。
⸻
3.3 验证端口映射
在 SSH Tunnel 建立之后,可以在本地电脑验证端口是否已经打开。
例如执行:
lsof -i :5901
如果 SSH 隧道正常运行,会看到本地端口已经被 SSH 进程占用。
此时从客户端访问 localhost:5901,实际上就等价于访问服务器上的 VNC Server。
3.4 多 Display 情况
在某些情况下,服务器可能会运行多个 VNC 会话,例如:
:1 → 5901
:2 → 5902
:3 → 5903
可以通过以下命令查看当前 VNC 会话:
vncserver -list
如果浏览器运行在 :3 Display,那么对应的 VNC 端口就是 5903。此时 SSH Tunnel 的端口映射也需要调整,例如:
ssh -i your-key.pem -L 5903:localhost:5903 ubuntu@your-ec2-ip
完成 SSH Tunnel 配置之后,本地电脑就可以通过 localhost 访问服务器上的远程桌面。接下来只需要在客户端安装 VNC Viewer 并连接到这个本地端口,就可以进入服务器桌面并看到正在运行的浏览器环境。
4 客户端连接配置(Mac)
在服务器端完成桌面环境、VNC 服务以及 SSH Tunnel 配置之后,最后一步是在本地电脑上连接远程桌面。由于 SSH Tunnel 已经将服务器端口映射到了本地,因此客户端实际上只需要连接本地端口即可。
换句话说,从客户端角度来看,远程桌面其实就运行在本机的 localhost 上。
⸻
4.1 安装 VNC 客户端
首先需要在本地电脑安装一个 VNC Viewer。常见的 VNC 客户端包括:
• TigerVNC Viewer
• RealVNC Viewer
• TightVNC
在 macOS 环境中,TigerVNC Viewer 或 RealVNC Viewer 都比较常用。
例如使用 Homebrew 安装 TigerVNC:
brew install tigervnc
安装完成后,可以使用 vncviewer 命令启动客户端。
4.2 确认 SSH Tunnel 已建立
在连接远程桌面之前,需要确保 SSH Tunnel 仍然保持连接状态。例如在另一个终端窗口中运行:
ssh -i your-key.pem -L 5901:localhost:5901 ubuntu@your-ec2-ip
只要这个 SSH 连接保持打开,本地端口 5901 就会被转发到服务器。
⸻
4.3 连接远程桌面
接下来可以启动 VNC Viewer 并连接到本地端口。
连接地址为:
localhost:5901
如果使用命令行方式,可以直接运行:
vncviewer localhost:5901
连接成功后,系统会要求输入之前在服务器上设置的 VNC 密码。
验证成功后,就可以进入服务器桌面。
⸻
4.4 验证浏览器环境
成功连接后,可以看到服务器上的 Linux 桌面环境(XFCE)。此时服务器就像一台远程电脑,可以在桌面中打开终端、启动浏览器或运行其他程序。
如果前面已经启动了 Chromium 浏览器,例如:
DISPLAY=:1 /snap/bin/chromium --remote-debugging-port=9222
那么在 VNC 桌面中应该可以直接看到浏览器窗口。
此时浏览器已经运行在服务器环境中,并且开启了 DevTools 调试端口,OpenClaw 可以通过该端口接管浏览器并执行自动化任务
5 在远程桌面运行 OpenClaw
在服务器端完成桌面环境、浏览器环境以及远程访问配置之后,最后一步是让 OpenClaw 接管浏览器并执行自动化任务。
OpenClaw 并不是直接启动浏览器,而是通过 Chrome DevTools Protocol(CDP) 控制已经运行的浏览器实例。因此,在启动浏览器时需要开启 remote debugging port,这样 OpenClaw 才能连接到浏览器并进行操作。
整个流程可以理解为三步:
1. 在服务器桌面启动浏览器
2. 浏览器开启 DevTools 调试端口
3. OpenClaw 连接该端口并接管浏览器
⸻
5.1 启动浏览器并开启调试端口
在服务器终端中启动 Chromium,并开启远程调试端口。
例如:
DISPLAY=:1 /snap/bin/chromium \
--remote-debugging-port=9222 \
https://x.com/login &
5.2 手动完成账号登录
在第一次运行浏览器时,需要在 VNC 桌面中手动登录 Twitter 账号。
步骤通常包括:
• 输入账号密码
• 通过验证码验证
• 完成账号登录
完成登录后,浏览器会保存登录状态(Cookie / Session)。只要浏览器实例不被关闭,登录状态就会一直保持。
这一步实际上非常重要,因为很多社交平台会对自动化登录进行严格限制。通过手动登录,可以确保浏览器环境与真实用户行为保持一致。
⸻
5.3 OpenClaw 接管浏览器
当浏览器开启 DevTools 调试端口后,OpenClaw 就可以通过该端口接管浏览器。
OpenClaw 的运行逻辑通常是:
OpenClaw Agent
↓
连接 9222 DevTools
↓
控制 Chromium
↓
执行网页操作
例如:
• 打开 Twitter 页面
• 输入推文内容
• 点击发布按钮
• 浏览时间线
这些操作本质上都是通过 DevTools 协议控制浏览器执行。
6 常见问题与调试
在实际运行过程中,远程桌面环境、浏览器以及自动化程序之间可能会出现各种问题。这些问题通常并不是某一个组件单独导致的,而是多个系统之间的协作问题,例如显示环境、端口映射或权限配置。
本节整理了一些在部署过程中比较常见的问题,以及对应的排查方法。
⸻
6.1 VNC 连接成功但只有灰色屏幕
一个比较常见的情况是:VNC Viewer 可以成功连接服务器,但进入桌面后只看到灰色背景和一个鼠标指针,没有任务栏或桌面环境。
这种情况通常说明 VNC Display 已经启动,但桌面环境没有启动。
可以通过查看 VNC 配置脚本确认:
cat ~/.vnc/xstartup
如果没有正确配置桌面环境,可以写入:
#!/bin/bash
xrdb $HOME/.Xresources
startxfce4 &
然后重新启动 VNC:
vncserver -kill :1
vncserver :1
重新连接后,应该可以看到完整的桌面环境。
6.2 无法连接 VNC
如果客户端无法连接远程桌面,可以从以下几个方面检查。
首先确认 VNC Server 是否已经启动:
vncserver -list
如果没有运行中的会话,可以重新启动:
vncserver :1
然后确认 SSH Tunnel 是否仍然保持连接。如果 SSH 终端已经关闭,本地端口转发也会随之失效。
可以重新建立 SSH Tunnel:
ssh -i your-key.pem -L 5901:localhost:5901 ubuntu@your-ec2-ip
6.3 浏览器无法在 VNC 桌面启动
如果 Chromium 启动时报错,例如无法打开显示环境,通常是因为没有指定正确的 DISPLAY。
可以先查看当前 VNC Display:
vncserver -list
那么浏览器需要指定:
DISPLAY=:1 /snap/bin/chromium
如果 DISPLAY 设置错误,浏览器就无法在桌面环境中显示窗口。
⸻
6.4 DevTools 调试端口无法访问
OpenClaw 需要通过 DevTools 调试端口(通常是 9222)连接浏览器。如果该端口没有成功开启,自动化程序将无法接管浏览器。
可以在服务器上检查端口是否已经监听:
lsof -i :9222
如果没有进程监听该端口,需要重新启动浏览器并开启调试端口:
DISPLAY=:1 /snap/bin/chromium \
--remote-debugging-port=9222 &
然后可以通过以下命令测试接口是否正常:
curl http://localhost:9222/json
如果返回浏览器页面信息,说明 DevTools 端口已经正常工作。
⸻
6.5 无法在 VNC 桌面打开 Chromium(Authorization 错误)
在某些情况下,snap 版本的 Chromium 会因为 X11 权限问题而无法访问桌面环境,并报出类似 Authorization required 的错误。
这种情况下需要允许本地程序访问当前 Display:
DISPLAY=:1 xhost +local:
执行后再启动浏览器,通常可以解决权限问题。
⸻
在这类远程浏览器环境中,很多问题其实都与三个核心因素有关:
DISPLAY
端口
权限
只要逐步确认这三点,大多数问题都可以比较快地定位出来。
从工程经验来看,这种远程浏览器架构虽然比 headless 自动化复杂一些,但调试能力也更强。因为所有浏览器行为都可以在桌面中直接观察到,这在处理复杂网页交互时往往非常有价值。
7 总结
通过前面的步骤,我们从一台默认只有命令行的 Ubuntu 云服务器开始,逐步搭建了一个可以远程控制的浏览器运行环境。整个系统由多个组件共同组成,每一层都承担着不同的角色。
在服务器侧,AWS EC2 提供基础计算环境;Linux 桌面环境(XFCE)负责提供图形界面;TigerVNC 用于远程桌面访问;Chromium 浏览器则作为自动化任务的执行载体。与此同时,通过 SSH Tunnel 建立安全连接,可以避免直接暴露 VNC 端口,从而提升整体安全性。
在客户端侧,本地电脑通过 SSH 建立端口转发,再使用 VNC Viewer 连接本地端口,从而进入服务器桌面。由于所有通信都通过 SSH 加密传输,因此不需要在服务器安全组中开放额外端口。
当浏览器通过 --remote-debugging-port=9222 启动后,OpenClaw 就可以通过 Chrome DevTools Protocol 接管浏览器并执行自动化任务,例如发布推文、浏览时间线或执行其他网页操作。
整个系统的运行结构可以概括为:
本地电脑
│
SSH Tunnel
│
AWS EC2
│
TigerVNC Server
│
Linux Desktop (XFCE)
│
Chromium Browser
│
OpenClaw Agent
这种架构的核心思路,是在云服务器上构建一个长期在线的浏览器工作环境。与传统的 headless 自动化相比,这种方式虽然稍微复杂一些,但在面对复杂网页环境时往往更加稳定,也更容易进行调试。
从工程角度来看,这种设计实际上为自动化系统保留了一条“可视化调试通道”。当自动化流程运行正常时,OpenClaw 可以直接控制浏览器完成任务;当出现异常情况时,开发者也可以通过远程桌面立即进入服务器环境,查看浏览器状态并进行人工干预。
更多推荐

所有评论(0)