| name | vnc-browser-launcher |
| description | 在沙箱 VNC 远程桌面上启动可见的浏览器窗口 |
| triggers | ["在 VNC 上打开浏览器","看到浏览器 UI","Playwright 有头模式显示"] |
VNC 浏览器启动器
在沙箱远程桌面 (VNC/KasmVNC) 上启动可见的浏览器窗口。
触发场景
- 用户要求"看到浏览器 UI"
- 需要在 VNC 桌面上显示网页
- Playwright 无头模式截图不够用,需要真实的浏览器窗口
核心问题
问题 1: xvfb-run 虚拟显示隔离
xvfb-run 创建独立的虚拟 X 服务器 (:99 或动态分配)
- 浏览器显示在 xvfb-run 的虚拟显示上,不在 VNC 的桌面 :1 上
- 用户在 VNC 桌面上看不到浏览器
问题 2: X Authority 授权问题
VNC 服务器使用 /root/.Xauthority 进行授权,但:
- 直接运行
xauth 命令会连不上 X 服务器
- 需要通过
XAUTHORITY=/root/.Xauthority 环境变量访问
问题 3: Playwright Firefox 包装脚本
/usr/local/bin/firefox 是 Playwright 的包装脚本
- 不支持
headless=False 显示在真实 X 服务器上
- 需要直接调用 Playwright 的 Python API
解决方案
方法 1: Playwright + DISPLAY=:1 (推荐)
⚠️ 【关键】环境变量必须在 import Playwright 之前设置!
import os
os.environ['DISPLAY'] = ':1'
os.environ['XAUTHORITY'] = '/root/.Xauthority'
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(
headless=False,
args=['--no-sandbox', '--disable-dev-shm-usage', '--disable-gpu']
)
page = browser.new_page()
page.goto("https://www.google.com")
page.wait_for_timeout(5000)
browser.close()
方法 1b: 后台持久运行(推荐用于 VNC 场景)
如果需要浏览器持续显示在 VNC 桌面上:
import os
import time
import signal
os.environ['DISPLAY'] = ':1'
os.environ['XAUTHORITY'] = '/root/.Xauthority'
from playwright.sync_api import sync_playwright
def cleanup():
try:
browser.close()
except:
pass
signal.signal(signal.SIGINT, lambda s,f: cleanup())
signal.signal(signal.SIGTERM, lambda s,f: cleanup())
with sync_playwright() as p:
browser = p.chromium.launch(
headless=False,
args=['--no-sandbox', '--disable-dev-shm-usage', '--disable-gpu']
)
page = browser.new_page()
page.goto("https://www.google.com", timeout=30000)
print("✅ 浏览器已在 VNC 桌面上运行!")
print("用户可在 http://localhost:6080 查看")
time.sleep(3600)
方法 2: 系统浏览器 + xauth 修复
export DISPLAY=:1
export XAUTHORITY=/root/.Xauthority
$DISPLAY xdpyinfo
chromium-browser --new-window https://www.google.com &
方法 3: 持久化浏览器会话
如果浏览器启动后立即退出:
export DISPLAY=:1
export XAUTHORITY=/root/.Xauthority
nohup chromium-browser --new-window https://www.google.com > /tmp/browser.log 2>&1 &
ps aux | grep chromium
环境信息
VNC 配置
| 项目 | 值 |
|---|
| VNC 端口 | 5900 |
| Web 访问 | http://localhost:6080 |
| 显示编号 | :1 |
| X Authority | /root/.Xauthority |
| 窗口管理器 | Openbox |
| 桌面环境 | KDE Plasma (plasmashell) |
可用浏览器
| 浏览器 | 路径 | 可用性 |
|---|
| Chromium | /usr/bin/chromium-browser | ✅ 推荐 |
| Chrome | /usr/bin/google-chrome | ✅ |
| Firefox | /usr/local/bin/firefox | ❌ Playwright 包装,不可用 |
调试命令
vncserver -list
w
DISPLAY=:1 XAUTHORITY=/root/.Xauthority xdpyinfo
ps aux | grep -E 'chromium|firefox|Xvnc'
DISPLAY=:1 XAUTHORITY=/root/.Xauthority scrot /tmp/screenshot.png
常见问题
Q: 浏览器进程存在但 VNC 桌面上看不到
A: 可能是窗口在屏幕外。尝试:
DISPLAY=:1 wmctrl -l
DISPLAY=:1 wmctrl -r "Chromium" -e 0,0,0,1280,800
Q: X Authority 错误
A: 总是使用完整的命令前缀:
DISPLAY=:1 XAUTHORITY=/root/.Xauthority <command>
Q: VNC 桌面完全看不到
A: 可能需要重启 VNC 服务:
vncserver -kill :1
vncserver :1 -geometry 1920x1080 -depth 24
关键教训
- 不要用 xvfb-run - 它创建独立的虚拟显示,VNC 看不到
- 始终设置 DISPLAY=:1 - 指向 VNC 桌面
- 始终设置 XAUTHORITY=/root/.Xauthority - 授权访问
- 使用 Playwright Python API - 比包装脚本更可靠
- 验证用 ps 和截图 -
w 命令显示的进程不一定在正确的 DISPLAY 上