在Windows下SSH到远程服务器,偶尔需要运行一些界面程序如ChromePyQT

在SSH中运行或者调试这些程序的时候都会直接报错,因为这些程序需要访问本地图形系统

如果有这种需求,可以借助VcXsrvXming等程序来实现在远程服务器上运行GUI程序,并在本地计算机中显示其内容

其工作原理如下

@startuml

title X11 Forwarding to VcXsrv Sequence Diagram

actor User
participant "Local Computer\n(Windows)" as Local
participant "SSH Client\n(OpenSSH)" as SSHClient
participant "Remote Server\n(Linux)" as Remote  
participant "VcXsrv\nX Server" as VcXsrv

User -> Local: Run VcXsrv \nSetup Display
User -> Local: SSH Remote Server
Local -> SSHClient++: Establish SSH Connection\nEnable X11 Forwarding
SSHClient -> Remote++: X11 Channel Request 
Remote -> SSHClient--: Accept Request

alt Application Uses GUI
    SSHClient -> VcXsrv++: Forward X11 Traffic
    VcXsrv -> SSHClient--: Display Output  
end

SSHClient -> Remote--: Send Input 
Remote -> Local: Application Output
Local -> User: Display Application GUI

@enduml

借助这个技术,可以在远程开发时使用开发一些GUI程序,非常方便

实现步骤如下

  1. 安装运行VcXsrv程序,并依次检查Multiple Windows-Start no client-Disable access control三个选项都勾选了
  2. 使用任意SSH客户端连接远程服务器,要设置启用X11转发选项(ssh -x username@hostname
  3. 运行任意GUI程序即可在本地看到GUI内容

首先在本地Windows中安装VcXsrv程序

  • 下载地址:https://github.com/ArcticaProject/vcxsrv/releases

安装后打开,记得勾选下面这个选项免去访问控制,之后根据需要自行启用

接着使用tabby,打开具体服务器的设置,并勾选X11转发,如下

登录服务器后,运行GUI程序,这里以x11-apps为例,安装x11-apps

sudo apt install x11-apps

接着运行xclock,效果如下