必须同时满足本地X Server运行、SSH双向X11配置开启、DISPLAY环境变量正确三件事;缺一不可,否则会出现“黑窗口”“Connection refused”或“Can't open display”。

能,但必须同时满足本地X Server运行、SSH双向X11配置开启、DISPLAY环境变量正确这三件事。缺一不可,且任意一环出错都会表现为“黑窗口”“Connection refused”或“Can't open display”。
Windows本地必须运行一个X Server(比如VcXsrv)
VcXsrv比Xming更稳定,推荐用它。安装后不要直接双击运行,而是启动XLaunch向导:
- 选 Multiple windows,不是“Single window”
- 选 Start no client,避免自动弹出xterm干扰判断
- 关键一步:在“Extra settings”里取消勾选 Native opengl,否则Matplotlib、RViz等程序会闪退
- 务必勾选 Disable access control,否则远程Linux无法连接本地X Server
- Display number 保持默认
:0即可,对应后续DISPLAY=localhost:0.0
完成后右下角出现X图标,说明服务已就绪。关闭它,所有X11转发立即中断。
Windows和Linux两端的SSH X11配置都要打开
只在VSCode里点“Remote-SSH”连接是不够的,X11转发需要底层SSH协议支持:
- Windows端(客户端):编辑
$env:ProgramData\ssh\ssh_config(PowerShell管理员运行),追加:
Host *
ForwardX11 yes
ForwardX11Trusted yes
XAuthLocation /usr/bin/xauth- Linux端(服务器):编辑
/etc/ssh/sshd_config,确保以下三行未被注释且值正确:
X11Forwarding yes X11UseLocalhost no AllowTcpForwarding yes
- 改完必须执行
sudo systemctl restart sshd,否则配置不生效
X11UseLocalhost no 是Windows环境下最关键的绕过项——OpenSSH默认绑定到localhost,而VcXsrv监听的是0.0通配地址,不设为no会导致连接被拒绝。
Windows 桌面自动化技能,支持鼠标控制(移动/点击/拖拽/滚轮/截图)、键盘输入(文字输入/按键/组合键)、窗口管理(查找/聚焦/最大化/最小化/关闭/移动)、截图并发送文件。提供两种截图方式:Python pyautogui 截图(集成在自动化流程中)和 PowerShell + .NET 零依赖截图(支持区域截图和多显示器)。当用户需要自动化 Windows 桌面操作、控制鼠标键盘、管理窗口、执行 GUI 自动化任务、截图发送文件时使用。
DISPLAY环境变量必须在远程终端里生效
VSCode Remote-SSH打开的终端默认不继承Windows的DISPLAY环境变量,也不能靠用户变量自动同步:
- 不要在Windows系统属性里设
DISPLAY=localhost:0.0然后指望它透传——几乎无效 - 正确做法是在远程Linux的shell配置文件(如
~/.bashrc)末尾加一行:export DISPLAY=localhost:10.0 - 为什么是
:10.0?因为SSH X11转发默认从10开始分配端口(localhost:10.0→ 实际映射到VcXsrv的:0) - 验证方式:在VSCode集成终端里执行
echo $DISPLAY,输出应为localhost:10.0;再运行xeyes,弹出眼睛窗口即成功
如果用launch.json调试Python,记得在env里显式写死:"DISPLAY": "localhost:10.0",不能依赖shell环境。
Remote X11 (SSH)插件其实不是必需的
这个插件名字容易误导,它并不参与X11数据转发,只是个UI辅助工具:
- 它不替代SSH的
-Y参数,也不修改sshd_config - 它唯一作用是把
DISPLAY值自动注入到VSCode调试配置中,省去手动写launch.json - 如果你用命令行
ssh -Y user@host连上去再开VSCode,或已在~/.bashrc里设好DISPLAY,那这个插件完全可以不用
真正容易被忽略的点是:每次修改~/.bashrc后,必须重启VSCode的Remote-SSH连接(断开再重连),否则新export不会加载进已有终端会话。

















