Windows通过X11转发显示远程Linux上的图形界面
Windows通过X11转发显示远程Linux上的图形界面
陈拓 2024/10/23-2024/11/14
1. X窗口系统和X11的基本概念
1.1 X窗口系统X Window System
Linux内核是没有图形化界面的,Linux的图形化界面,比如常见的GNOME、KDE 等桌面环境,它们实际上是构建在Linux内核之上的软件,可以看作是Linux系统下运行的应用程序。
Linux的图形界面需要X Window System(简称X)的支持。X Window System是一个网络透明、多字体、多窗口的图形用户界面系统,它允许用户通过图形界面与计算机交互。
1.2 X Window System的主要组成部分
X Window System使用客户端-服务器模型,其中:
X服务器(X Server):运行在本地机器上,负责处理输入设备(如键盘和鼠标)的事件,并将图形输出到显示器。
X客户端(X Client):图形界面程序,如窗口管理器、应用程序等,它们通过X协议与X服务器通信,请求显示图形界面。
X协议(X Protocol):定义了X客户端和X服务器之间通信的规则和数据格式。
X服务器和X客户端可以在同一台用户机器上,也可以在不同的机器上通过网络远程连接。
使用客户端-服务器模型,X客户端应用程序可以与X服务器建立连接,以通过图形原语(graphical primitives)与X服务器进行通信。
X Window System 设计的一个关键特性是网络透明性,这意味着X服务器和X客户端可以位于不同的物理机器上,通过网络传输进行通信。这种设计允许用户在一台机器上运行应用程序,而将图形界面显示在另一台机器上,这在远程工作和分布式计算环境中非常有用。
X Window System的客户端-服务器术语在远程场景中可能会造成混淆,因此请记住,在大多数情况下,X服务器在用户的计算机上运行,而X客户端在远程计算机上运行。
1.3 X11是什么
X11是X协议的第11个版本,X11也被称为X Window System,是一个用于图形窗口环境的标准协议。X11广泛应用于Unix和Linux操作系统中,用于管理和显示图形用户界面。X11允许用户与应用程序进行交互,支持多窗口操作,并且能够通过网络在不同的计算机之间共享用户图形界面(GUI)。
在Linux系统中,传统的图形界面(Graphical User Interface,GUI)很大程度上依赖于X11。X11是一种网络协议,也是一个软件架构,它提供了图形显示的基本框架。
随着技术的发展,出现了一些X11的替代方案。例如,Wayland是一种新的显示服务器协议,它被设计用来克服X11的一些缺点,如性能和安全性方面的问题。一些现代的Linux发行版开始支持Wayland,并且部分桌面环境(如 GNOME)也能够在 Wayland上运行。但是,目前X11仍然在广泛使用,尤其是在一些传统的Linux应用场景和对兼容性要求较高的系统中。因为有大量的旧有软件是基于X11开发的,并且在X11的生态系统中,这些软件能够稳定地运行。
通过第三方工具,比如VcXsrv,也可以在Windows操作系统上模拟X11环境,从而运行X11应用程序,这允许用户利用X11转发技术在Windows系统上显示来自远程Linux系统的图形界面,进而在本地机器上访问和操作远程Linux系统上的图形化应用程序。这种设置在需要从Windows机器上远程管理和使用Linux应用程序时非常有用。
更详细的说明见《什么是X11转发》
https://blog.csdn.net/chentuo2000/article/details/144420392?spm=1001.2014.3001.5502
1.4 X11转发是什么
X11转发是一种通过SSH协议实现的安全技术,它允许X11客户端和服务器之间的通信通过一个加密的隧道进行,这个隧道可以跨越网络,甚至是不安全的网络。
X11转发的主要目的是提高安全性,它确保了在远程会话中运行图形应用程序时,所有图形数据和用户输入都被加密,从而保护了数据不被截获或篡改。
X11转发依赖于X11协议,但它增加了一层安全性,使得远程访问图形界面变得更加安全。
1.5 X11 转发如何工作?
了解了X11转发的基础知识后,我们再看看X11转发是如何工作的。
- SSH通道隧道传输
SSH(Secure Shell)通道隧道传输是一种通过SSH协议创建的安全网络隧道,它允许数据通过一个加密的通道在网络之间传输。
- X11转发通过SSH通道进行隧道传输
X11转发遵循与X11相同的模型,但X客户端到X服务器的连接是通过SSH通道进行隧道传输的。为了实现此流程,SSH服务器将远程X客户端连接代理到SSH客户端,然后,SSH客户端再将其代理到用户的X服务器。
X11转发功能可以让我们通过SSH连接,直接运行对端Linux主机上的GUI程序,并将图形界面显示在本地机器上。这样,用户就可以在本地计算机上访问和操作远程Linux系统上的图形化应用程序。
- 远程连接情况下的SSH 服务器、SSH 客户端、X 服务器和 X 客户端的位置关系
在远程连接的情况下,SSH服务器位于远程机器,SSH客户端位于本地机器,X服务器通常位于本地机器,而X客户端位于远程机器。
- X11通过SSH隧道传输的实际流程
假设远程机器上有一个图形应用程序(X客户端),本地机器有一个X服务器用于显示图形。首先,本地的SSH客户端与远程的SSH服务器建立连接。
远程机器上的SSH服务器接收来自本地SSH客户端的连接请求并进行身份验证。一旦验证通过,远程机器上运行的X客户端的连接信息(包含图形应用程序发送图形显示相关指令的信息)通过已经建立的SSH通道被发送到本地的SSH客户端。
本地的SSH客户端收到这些信息后,将其代理到本地的X服务器。本地的X服务器根据X协议接收并处理这些信息,从而在本地显示器上显示出远程图形应用程序(X客户端)的图形界面。
这种设置使得用户可以在本地机器上显示和操作远程机器上运行的图形界面应用程序,同时利用SSH隧道保证数据传输的安全性。
- 实际应用场景示例
假设你在本地的Windows电脑上,想要访问和操作位于远程数据中心的Linux服务器上的图形化软件。你可以在本地Windows电脑上启动SSH客户端,连接到远程Linux服务器上的SSH 服务器。同时,在本地Windows电脑上运行一个模拟X服务器的软件(因为Windows本身没有原生的X服务器)。当你在远程Linux服务器上启动一个图形应用程序(X 客户端)时,通过SSH建立的安全通道将图形应用程序的连接信息传输到本地,然后由本地的X服务器进行图形显示,这样你就能在本地看到并操作远程机器上的图形应用程序了。
这就是为什么SSH的X11转发功能非常有用,因为它允许用户在远程机器上运行图形界面程序,并将显示转发回本地机器。
2. 远程和本地系统信息
在进行实际操作之前,我们先看看远程和本地系统信息。
2.1 远程Linux系统Ubuntu
用lsb_release -命令查看Ubuntu信息:
该命令用于打印Linux Standard Base (LSB) 和特定发行版信息。
2.2 本地系统Windows
用systeminfo命令查看Windows信息:
该命令用于显示Windows系统和计算机的详细信息,包括操作系统配置、安全设置等。
3. Ubuntu安装X服务器Xorg
什么是Xorg:
从前面的讲述我们知道,Linux的图形界面需要X Window System或者X11的支持,而X11是一个协议,协议本身只是一套规则和规范,需要具体的软件来实现这些规范,使其能够在实际的硬件上运行。
X.Org基金会提供了X Window System的开源实现,这个实现通常被称为X.Org Server简称Xorg。
因此,为了在 Linux 系统上运行图形界面应用程序,通常需要安装 Xorg。
Xorg是X11的一个流行且广泛使用的实现,在大多数现代Linux发行版中,当你听到X11时,实际上使用的就是Xorg。
3.1 查看Xorg的安装情况
- 查看Xorg安装情况
dpkg --get-selections | grep xorg
- 显示软件包的安装和候选版本的信息
sudo apt policy xorg
可以看出,我们的系统还未安装Xorg。
3.2 安装Xorg
- 更新系统软件包列表
sudo apt update
- 安装X服务器相关软件包
对于 Ubuntu Server 22.04要安装完整的X服务器,可以安装xorg软件包。
sudo apt install xorg
- 查看xorg的安装情况
dpkg --get-selections | grep xorg
- 查看具体版本
显示软件包的安装和候选版本的信息。
sudo apt policy xorg
sudo apt policy xserver-xorg
3.3 设置SSH服务端和客户端
为了通过ssh使用Xorg我们需要对ssh的服务端和客户端进行配置。
3.3.1 在Linux Ubuntu中设置ssh服务器配置文件
- 配置文件位置/etc/ssh/sshd_config
- 修改ssh服务器配置文件/etc/ssh/sshd_config
sudo nano /etc/ssh/sshd_config
取消下面这一行的注释,如果没有这一行,手动添加:
X11Forwrding yes
该设置允许SSH服务器转发X11会话。这意味着,当你通过SSH连接到服务器并运行一个图形界面程序时,该程序的图形界面可以被发送回你的本地机器上显示,而不是在服务器上显示。
3.3.2 在Windows中设置ssh客户端配置文件
打开Windows命令行窗口。
- 配置文件位置.ssh\config
dir .ssh\config
- 将当前命令行的编码设置为UTF8,否则中文显示乱码
chcp 65001
执行该命令后,命令行窗口会显示“Active code page: 65001”,表示编码已成功更改为UTF8。
- 查看配置文件
type .ssh\config
取消ForwardX11 yes这一行的注释,如果没有这一行,手动添加。
该设置可以在ssh登录时无需在使用-X参数,例如:
ssh ct@192.168.137.9
否则要在SSH命令中添加-X参数来登录,例如:
ssh -X ct@192.168.137.9
3.4 启动Xorg
- 设置完成后,重新启动系统
sudo reboot
- 检查X服务器是否正在运行
ps -aux | grep X
其中:1287是xorg进程,1791是查询进程。
- 以后每次开机或者重启系统,X服务器都会自动启动
4. 设置DISPLAY环境变量
如前所述,本地Windows是X服务器,远程Linux是X客户端。
DISPLAY环境变量用于指定X服务器显示的位置。
4.1 设置DISPLAY
- 设置DISPLAY环境变量
export DISPLAY=192.168.137.1:0.0
其中,192.168.137.1是远程主机的IP地址,也就是我们要显示图形界面的Windows系统的IP地址。
:0.0指定X服务器的显示号和屏幕号。是X Window系统中用于定位特定X服务器和屏幕的标准格式。
:0部分是显示号,它标识了X服务器的编号。在X Window系统中,可以运行多个X服务器实例,每个实例都会被分配一个唯一的显示号。显示号通常是一个数字,紧跟在冒号后面。在大多数情况下,如果你的机器上只运行了一个X服务器,那么它的显示号就是:0。
点0(.0)部分是屏幕号,它标识了在给定显示号上的特定屏幕。在多屏幕环境中,一个显示号下可以有多个屏幕,每个屏幕都有一个编号,从0开始。对于单屏幕设置,屏幕号通常是 .0。
综上所述,192.168.137.1:0.0 表示连接到IP地址为192.168.137.1的机器上的X服务器,使用显示号0和屏幕号0。
export DISPLAY=192.168.137.1:0.0命令确保这些程序知道它们应该将图形输出发送到哪个X服务器。
- 获取显示号和屏幕号
在后面“通过XLaunch配置X11服务”小节中,配置完X11服务后,桌面右下角会出现X服务图标,将鼠标悬停在X服务的图标上,即可看到显示号和屏幕号,如图:
4.2 永久设置DISPLAY环境变量
- 设置~/.bashrc文件
用export DISPLAY命令设置的环境变量是临时的,一旦重新启动系统还需要再设置。
如果要永久设置并开机自动启用可以修改~/.bashrc文件:
echo -e \n##DISPLAY Configuration >> ~/.bashrc
echo export DISPLAY=192.168.137.1:0.0 >> ~/.bashrc
- 查看配置
cat ~/.bashrc
看最后两行:
这就是我们刚才写入的设置。
- 配置立即生效
source ~/.bashrc
- 查看DISPLAY环境变量
echo $DISPLAY
4.3 更改环境变量
系统运行时,DISPLAY环境变量是可以随时改变的,每当发布新的export DISPLAY命令时,旧的环境变量就被覆盖了。
4. 在Windows上安装VcXsrv
通过第三方工具,比如VcXsrv,也可以在Windows操作系统上模拟X11环境,从而运行X11应用程序,这允许用户利用X11转发技术在Windows系统上显示来自远程Linux系统的图形界面,进而在本地机器上访问和操作远程Linux系统上的图形化应用程序。这种设置在需要从Windows机器上远程管理和使用Linux应用程序时非常有用。
为了能够在Windows系统上显示远程Linux系统通过X11服务转发的图形界面,需要在Windows上安装VcXsrv软件并进行正确配置的。
VcXsrv是微软Windows的开源显示服务器。它使Windows操作系统的用户能够运行为X Window System设计的GUI程序。
本地Windows是X11服务器,远程Linux是X11客户端。
5.1 下载VcXsrv
VcXsrv的下载网址是:
点击Download下载:
vcxsrv-64.1.20.14.0.installer.exe
下载后安装,过程很简单。
VcXsrv安装完成后在开始菜单和桌面上都可以找到Xlaunch图标:
5.2 Xlaunch
VcXsrv是实际的X11服务器,而Xlaunch是一个用于配置和启动VcXsrv的工具。
用户可以通过Xlaunch来设置VcXsrv的启动参数,然后由Xlaunch启动 VcXsrv。
没有Xlaunch,用户也可以直接启动VcXsrv,但需要手动设置环境变量或使用命令行参数。见“启用访问控制安全地使用X11转发”
Xlaunch提供了一个方便的图形界面来管理VcXsrv的配置,使得启动和配置X11 服务器变得更加容易。
总的来说,Xlaunch是一个辅助工具,它使得配置和启动VcXsrv变得更加直观和方便,而VcXsrv是实际提供X11服务的服务器程序。
5.3 通过XLaunch启动X11服务
运行XLaunch,生成X11服务的配置。
- 启动XLaunch,选择Multiple windows模式
点击下一页。
选择启动客户端的方式,选择Start no client
下一页。
- 附加设置,3个选项都勾选,特别是第三个选项要勾选,否则会有很多麻烦。
下一页。
- 点击“完成”,X11服务器就会启动
设置完成后X Server就启动了,开始监听远程X转发。桌面右下角会出现X服务图标:
或者
- 重要信息
将鼠标悬停在X服务的图标上,可以显示客户端(即远程Ubuntu)怎样设置DISPLAY环境变量。
其中LAPTOP-0RKN74J1时我的计算机名,在电脑属性中可以看到:
:0.0是显示号和屏幕号,在
在前面“设置DISPLAY环境变量”章节中会用到。
6. 测试X11转发
6.1 安装X app进行测试
- 查看X app是否安装
sudo apt policy x11-apps
- 如果没有安装,运行下面的命令
sudo apt install x11-apps
6.2 运行xeyes
在Ubuntu系统上运行xeyes:
在windows系统界面上显示Ubuntu系统上运行的图形界面app:
Ctrl+C退出。
7. 用xauth管理X11授权文件
这一节是为下一节做准备的,在下一节中我们将使用命令行启动X服务,并启用访问控制access control。
7.1 .Xauthority文件
X服务授权文件.Xauthority文件在X Window系统中扮演着重要的角色,它用于存储和管理X服务器的授权信息,确保只有合法的用户可以访问X服务器。
在使用SSH等工具进行X11转发时,xauth用于管理X会话的授权信息。也就是说,xauth工具是用于管理.Xauthority文件的,允许添加、删除和查看其中的X服务器授权记录。
注意:X11服务器和客户端都要有.Xauthority文件,并且有相同的授权记录。
下面我们在 Linux 机器中生成.Xauthority文件,然后拷贝到Windows的用户家目录。
在Linux系统中生成.Xauthority文件的步骤:
- 查看.Xauthority文件是否存在
X授权文件.Xauthority文件位于家目录下:
ls -l ~/.Xauthority
- 如果存在,备份旧的.Xauthority文件
mv ~/.Xauthority ~/.Xauthority.old
- 生成新的.Xauthority文件
touch ~/.Xauthority
- 修改.Xauthority文件的权限
chmod 600 ~/.Xauthority
7.2 安装xauth
在安装Xorg时通常会建议同时安装xauth,但并不是强制性的。
- 安装命令
sudo apt-get update
sudo apt-get install xauth
xauth工具通常很小,不会对系统造成太大负担。
- 查看安装情况
sudo apt policy xauth
7.3 使用xauth
xauth有两种使用方式:
可以运行xauth,进入命令提示符xauth>再操作。
也可以直接用xauth+命令进行操作。
- 运行xauth
- 查看版本
或者
下面我们使用xauth+命令的方式操作。
- 帮助
- 查看所有的命令
- 生成授权记录
xauth add $DISPLAY . $(xxd -l 16 -p /dev/urandom)
其中:
$DISPLAY是第4节中设置的DISPLAY环境变量,查看DISPLAY环境变量:
echo $DISPLAY
该环境变量指定了X服务器的显示号:0。它告诉 xauth 命令将新的授权密钥添加到哪个显示号。
/dev/urandom是一个特殊文件(在类Unix系统中称为字符设备文件),它提供了一个源,用于生成随机字节。这个文件由内核维护,并且可以被任何程序读取以获取随机数据。
. $(xxd -l 16 -p /dev/urandom) 这部分用来生成一个新的随机授权密钥(MIT-MAGIC-COOKIE-1),并将其添加到 X 服务器的授权列表中。
xxd 是一个命令行工具,用于创建十六进制转储或将十六进制转储转换回原始数据。
-l 16 指定xxd输出16个字节(128位)的数据。
-p 参数告诉xxd仅输出原始数据,不带任何十六进制表示。
因此,xxd -l 16 -p /dev/urandom 命令生成16个字节的随机数据,用作新的授权密钥。
在xauth命令中,点(.)是一个占位符,表示授权密钥的开始。
综上所述,xauth add $DISPLAY . $(xxd -l 16 -p /dev/urandom) 命令的作用是为当前用户的 X 服务器添加一个新的随机授权密钥。这样做可以确保 X11 转发的安全性,因为每次 SSH 连接时都会生成一个新的密钥,而不是使用固定的密钥,从而降低了被未授权访问的风险。
- 查看授权记录
xauth list
- 删除授权信息
要删除某个显示的授权信息,可以使用:
xauth remove display_name
7.4 同步.Xauthority文件
要确保本地(Windows)和远程(Linux)系统上的.Xauthority文件中的授权信息是同步的。你可以使用xauth工具来管理这些信息。
在Windows系统中机器中拷贝.Xauthority到本地,可通过cmd调用scp拷贝:
scp user@ip:~/.Xauthority C:\Users\用户
- 查看我的C:\Users\用户
- 执行scp命令
scp ct@192.168.137.9:~/.Xauthority C:\Users\admin
- 查看本地.Xauthority文件
dir .Xauthority
本地.Xauthority文件的路径:"C:\Users\admin\.Xauthority"
8. 启动X服务,并启用访问控制
在“5.3 通过XLaunch配置X11服务”小节中,用XLaunch配置VcXsrv时要勾选Disable access control禁用访问控制之后,远程的Linux才能转发图形界面成功。但是,在配置VcXsrv时,禁用访问控制(access control)并不是一个推荐的安全做法,尤其是在生产环境或公共网络上。禁用访问控制意味着任何客户端都可以连接到你的X服务器,这可能会带来安全风险。
8.1 在Xlaunch中启用访问控制
- Windows通过XLaunch启动X11服务
Extra settings选项:
设置参数:-auth "C:\Users\admin\.Xauthority"
- 在Windows上用ssh登录Ubuntu
ssh ct@192.168.137.9
- 设置DISPLAY环境变量
export DISPLAY=192.168.137.1:0.0
- 在Ubuntu系统上运行xeyes
8.2 在Windows系统中通过命令行启动VcXsrv
在本小节中我们将使用命令行启动X服务,并启用访问控制access control。当然也可以通过XLaunch启动X11服务,设置见后面9.2小节。
- VcXsrv的安装目录
- 命令行运行VcXsrv获取帮助
"D:\Program Files\VcXsrv\vcxsrv.exe" -h
查看生成的帮助XWin.log,见附录。
8.2 启动Vcxsrv
- 在Windows命令窗口执行下面的命令
"D:\Program Files\VcXsrv\vcxsrv.exe" -multiwindow -clipboard -wgl -auth "C:\Users\admin\.Xauthority"
其中:
-multiwindow:
以多窗口模式运行服务器。在这种模式下,X11应用程序将在单独的窗口中运行,而不是覆盖整个屏幕。这允许多个X11应用程序同时查看,类似于标准的桌面环境。
-clipboard:
启用这个选项后,VcXsrv 将支持剪贴板共享。这意味着你可以在X11应用程序和 Windows应用程序之间复制和粘贴文本。默认值已启用,所以这个选项可以省略。
-wgl:
这个选项启用了对Windows OpenGL的支持。WGL(Windows Graphics Library)是OpenGL的一个实现,用于Windows系统。通过启用这个选项,VcXsrv可以支持需要OpenGL加速的X11应用程序,从而提高图形性能。
-auth "C:\Users\admin\.Xauthority":
这个选项指定了X11授权文件.Xauthority的路径。-auth参数后面跟着的是.Xauthority文件的完整路径。我们在上一小节已经同步了.Xauthority文件。
- 在Windows上用ssh登录Ubuntu
ssh ct@192.168.137.9
- 设置DISPLAY环境变量
export DISPLAY=192.168.137.1:0.0
- 在Ubuntu系统上运行xeyes
9. 总结
本文详尽地阐述了如何在Windows系统上,借助X服务,展示远程Ubuntu系统上的图形界面。
文中深入浅出地介绍了X服务的基本概念及其实现方式。首先,详细讲解了通过简单禁用访问控制来实现X转发的便捷方法,同时也深入探讨了启用访问控制以实现更安全X转发的方法。
此外,本文不仅展示了如何利用XLaunch工具配置并启动X服务的过程,还举例说明了通过命令行进行配置和启动X服务的详细步骤。
9.1 无访问控制简明步骤
- Windows通过XLaunch启动X11服务
Extra settings选项:
- 在Windows上用ssh登录Ubuntu
ssh ct@192.168.137.9
- 设置DISPLAY环境变量
export DISPLAY=192.168.137.1:0.0
- 在Ubuntu系统上运行xeyes
9.2 有访问控制简明步骤
- Windows通过XLaunch启动X11服务
Extra settings选项:
- 在Windows上用ssh登录Ubuntu
ssh ct@192.168.137.9
- 设置DISPLAY环境变量
export DISPLAY=192.168.137.1:0.0
- 在Ubuntu系统上运行xeyes
参考文档
- VcXsrv 配置 access control
https://zhuanlan.zhihu.com/p/690801946