# Ubuntu 25.10 原生桌面远程,终于跑通了....再也不用买 mac 了
由于家里没有 MacMini,所以之前 OpenClaw 刚起来的时候,我用零刻 Me Mini 单独跑了一套 Ubuntu 25.10 的裸系统。本地图形化桌面么,不用去配置远程、映射,直接连 HDMI 就能用。 但是随着跑的业务越来越多以后,我发现只用 IM 工具和 SSH 并不能很好的解决我使用它的场景。于是我开始尝试使用 windows 原生的 RDP 来远程。 远程,很简单对吧。脑子里第一反应就是装了 xrdp,然后搞定收工。 ``` ``` sudo apt install xrdp ``` ``` 然后我还很熟练的关闭 Wayland,开启 X11,等我悄咪咪打开 mstsc 远程桌面连接后 —— **黑屏。** **???** 大概是 GUI 不对,于是在网上找了一些方案,跑了各种 GUI,结果发现最大的问题就是没办法使用原生 Wayland,我跑在桌面上各种配置好的网页、应用,一到 RDP 就变成了丑不拉几的界面,一点用不下去。 我是真不懂阿,毕竟很少想不开远程 Ubuntu 的。然后看着价格高居不下的 Mac Mini,我决心还是换个思路来解决远程的问题。 后来 OpenClaw 提醒我,GNOME 自带了一个叫 `gnome-remote-desktop` 的组件,**原生支持 Wayland 下的 RDP**。而且系统里其实已经预装了,只是没有启用。 ``` ``` # 启用它 systemctl --user enable --now gnome-remote-desktop.service ``` ``` 然后设置一下 RDP 的登录凭据: ``` ``` # 需要连接到桌面会话的 D-Bus export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus # 设置用户名和密码 grdctl rdp set-credentials myuser mypassword ``` ``` 生成 TLS 证书(RDP 需要 TLS 加密): ``` ``` mkdir -p ~/.local/share/gnome-remote-desktop openssl req -x509 -newkey rsa:2048 \   -keyout ~/.local/share/gnome-remote-desktop/rdp-tls-key.pem \   -out ~/.local/share/gnome-remote-desktop/rdp-tls-cert.pem \   -days 365 -nodes \   -subj "/CN=$(hostname)" ``` ``` 指定证书路径: ``` ``` grdctl rdp set-tls-cert ~/.local/share/gnome-remote-desktop/rdp-tls-cert.pem grdctl rdp set-tls-key ~/.local/share/gnome-remote-desktop/rdp-tls-key.pem ``` ``` 配置完成后查看状态: ``` ``` grdctl status --show-credentials ``` ``` 输出大概长这样: ``` ``` Overall:     Unit status: active RDP:     Status: enabled     Port: 3389     TLS certificate: /home/user/.local/share/gnome-remote-desktop/rdp-tls-cert.pem     TLS fingerprint: ab:cd:ef:...     TLS key: /home/user/.local/share/gnome-remote-desktop/rdp-tls-key.pem     View-only: no     Username: myuser     Password: mypassword ``` ``` **完美!** 然后熟练的反代 3389 端口,配置域名,打开远程 RDP,链接,**错误代码 0x904。** 查了一下日志: ``` ``` journalctl --user -u gnome-remote-desktop.service --since "1 min ago" ``` ``` 看到了这行: ``` ``` gnome-remote-desktop-daemon: ../src/libei-connection.c:75: ei_connection_get_context: Assertion `connection' failed. ``` ``` 服务直接 **中断** 了。**上游 gnome-remote-desktop 49.0 的已知 bug。** 当 RDP 客户端断开连接时,libei 试图获取一个已经不存在的连接上下文,然后——****,断言失败,进程直接被杀死。 然后查了查相关的资料,发现**view-only 模式不走 libei。** 然后测试了一下,果然,先开启 view-only,连接以后再关闭,这样远程 RDP 就可以直接操作 Ubuntu 桌面了 **稳定如老狗** # 开始起飞 然后我就创建了一个脚本,大致思路就是先 view-only 开启服务,连上后断 view-only,监听 3389 连接,无连接自动重启再次开启监听。 ``` ``` 服务启动 → 开启 view-only(稳定,不崩溃)     ↓ 用户连上 RDP(view-only 模式,绕过 libei bug)     ↓ 检测到连接 → 关闭 view-only(libei 此时已经正常初始化)     ↓ 用户正常操作鼠标键盘     ↓ 用户断开 → 服务崩溃 → 自动重启 → 回到第一步 ``` ``` ### 第一步:给服务加崩溃自动重启 ``` ``` mkdir -p ~/.config/systemd/user/gnome-remote-desktop.service.d cat > ~/.config/systemd/user/gnome-remote-desktop.service.d/override.conf << 'EOF' [Service] Restart=always RestartSec=1 EOF ``` ``` 这样 libei 崩了之后,1 秒内自动重启。 ### 第二步:创建 Watcher 脚本 这是整个方案的核心。用端口连接状态来判断用户是否在线: ``` ``` mkdir -p ~/.local/bin cat > ~/.local/bin/rdp-watcher.sh << 'SCRIPT' #!/bin/bash # RDP Watcher - View-Only 自动切换 # 原理:检测 3389 端口 TCP 连接状态 #   无连接 → view-only ON(稳定) #   有连接 → view-only OFF(可操作) export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus state="idle" while true; do   if ss -tn state established 2>/dev/null | grep -q ':3389'; then     if [ "$state" = "idle" ]; then       sleep 1       grdctl rdp disable-view-only >/dev/null 2>&1       state="connected"     fi   else     if [ "$state" = "connected" ]; then       # 连接断开了,等服务崩溃重启稳定后,再开 view-only       sleep 5       grdctl rdp enable-view-only >/dev/null 2>&1       state="idle"     elif [ "$state" = "idle" ]; then       # 空闲时确保 view-only 是开着的       grdctl rdp enable-view-only >/dev/null 2>&1     fi   fi   sleep 2 done SCRIPT chmod +x ~/.local/bin/rdp-watcher.sh ``` ```
-
• 每 2 秒检测一次 3389 端口有没有 TCP 连接
-
• 没连接 → 开 view-only,等待用户连接
-
• 有连接 → 关 view-only,用户可以操作
-
• 连接断开 → 等 5 秒(让崩溃和重启完成)→ 重新开 view-only
**不用日志,不用 D-Bus 监听,就一个 `ss` 命令,简单粗暴且可靠。** ### 第三步:注册为 systemd 用户服务 ``` ``` cat > ~/.config/systemd/user/rdp-watcher.service << 'EOF' [Unit] Description=RDP View-Only Auto-Switch Watcher After=gnome-remote-desktop.service [Service] ExecStart=%h/.local/bin/rdp-watcher.sh Restart=always RestartSec=5 [Install] WantedBy=default.target EOF systemctl --user daemon-reload systemctl --user enable --now rdp-watcher.service ``` ``` ## ✅ 最终效果 全部配置完成后: ``` ``` # 确认两个服务都在跑 systemctl --user status gnome-remote-desktop.service systemctl --user status rdp-watcher.service ``` ``` 然后用任意 RDP 客户端连接。**连上就能操作,断开再连也没问题。全程自动,不需要手动干预。** 好了,我可以美美的开始办公远程做游戏了~~ 三国曹操传美少女版,启动! [![image_1.png](https://bost.lesrec.cn/uploads/images/gallery/2026-05/scaled-1680-/qHwE5Hij1kHKpNHG-image-1.png)](https://bost.lesrec.cn/uploads/images/gallery/2026-05/qHwE5Hij1kHKpNHG-image-1.png)