SSH 远程服务器运行 GUI 程序的三种方法

问题场景:通过 SSH 连接到无图形界面的 Linux 服务器,需要运行 TkInter、PyQt 等 GUI 程序,报错 _tkinter.TclError: no display name and no $DISPLAY environment variable

背景

Linux GUI 程序需要连接到一个 X Server 才能显示窗口。个人桌面环境自带 X Server,但服务器通常不安装图形桌面,也没有物理显示器,因此 $DISPLAY 环境变量为空,GUI 程序无法启动。


方法一:SSH X11 转发(最推荐,适合个人桌面用户)

原理:SSH 将服务器上的 GUI 窗口通过网络转发到本地机器的 X Server 上显示。

适用场景:本地是 Linux/macOS/Windows 桌面,网络延迟不高。

操作步骤

1. 本地安装 X Server(如未安装):

| 系统 | 所需软件 |

|------|----------|

| Linux 桌面 | 自带,无需安装 |

| macOS | 安装 XQuartz |

| Windows | 安装 VcXsrv 或 Xming |

2. 使用 -X-Y 参数 SSH 连接服务器:


ssh -X user@your-server

# 或

ssh -Y user@your-server  # 可信模式,性能更好

3. 直接运行 GUI 程序:


npm run dashboard

# 或 python3 your_gui_app.py

窗口会直接出现在你的本地桌面上。

常见问题

Q: 报错 X11 connection rejected because of wrong authentication

在服务器上确认 /etc/ssh/sshd_config 中有:


X11Forwarding yes

然后重启 sshd:sudo systemctl restart sshd

Q: 界面很卡

正常现象,X11 转发在网络较差时确实会卡。换方法二。


方法二:Xvfb + x11vnc + SSH 端口转发(最稳定)

原理:在服务器上用虚拟显示器(Xvfb)运行 GUI,用 VNC 将画面暴露出来,再通过 SSH 隧道在本地查看。

适用场景:网络延迟较高、需要长时间运行 GUI、本地是 Windows 且不想装 X Server。

操作步骤

1. 安装依赖:


# Xvfb 通常已自带,检查一下

which Xvfb



# 安装 VNC 服务端

sudo apt install -y x11vnc

2. 在服务器上启动虚拟显示器和 VNC:


# 启动虚拟显示器(分辨率可按需调整)

Xvfb :99 -screen 0 1920x1080x24 &



# 在虚拟显示器上启动 VNC 服务

x11vnc -display :99 -forever -nopw -listen localhost -rfbport 5900 &

3. 在虚拟显示器上运行你的 GUI 程序:


DISPLAY=:99 npm run dashboard &

4. 本地机器做 SSH 端口转发(新开一个本地终端):


ssh -L 5900:localhost:5900 user@your-server

5. 本地用 VNC 客户端连接:

打开任意 VNC 客户端(RealVNC、TigerVNC、Remmina、TurboVNC 等),连接 localhost:5900,即可看到 GUI 界面。

6. 使用完毕后清理:


kill %1 %2 %3    # 关闭后台进程

# 或精确清理

pkill -f ecc_dashboard.py

pkill -f x11vnc

pkill -f "Xvfb :99"


方法三:Xvfb 直接运行(纯无头,不需要看界面)

原理:如果 GUI 程序只是用来执行某些操作、生成输出文件,而无需人工交互,用 Xvfb 提供虚拟显示器即可。

适用场景:GUI 程序的运行结果不依赖人工查看/操作(如批量截图、自动化测试)。


Xvfb :99 -screen 0 1280x1024x24 &

DISPLAY=:99 python3 your_script.py

kill %1


三种方法对比

| 维度 | 方法一 SSH X11 | 方法二 Xvfb+VNC | 方法三 纯 Xvfb |

|------|---------------|-----------------|---------------|

| 需要本地装软件 | X Server | VNC 客户端 | 无 |

| 画面流畅度 | 延迟高时卡顿 | 较好 | 看不到 |

| 操作复杂度 | 低 | 中 | 低 |

| 适合场景 | 快速看一眼 | 长时间交互 | 自动化脚本 |


总结

  • 只是想临时看个 GUI → 方法一,ssh -X 一步到位

  • 需要稳定交互、长期运行 → 方法二,VNC 体验最好

  • 程序能自动跑完不需要看 → 方法三,最省事

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐