X-Window介绍与使用

一、基本介绍

  X Window即X Window图形用户接口,是一种以位图方式显示的软件窗口系统,最初是1984年麻省理工学院的研究成果,之后变成UNIX、类UNIX、以及OpenVMS等操作系统所一致适用的标准化软件工具包及显示架构的运作协议。
  X Window通过软件工具及架构协议来建立操作系统所用的图形用户界面,此后则逐渐扩展适用到各形各色的其他操作系统上,几乎所有的操作系统都能支持与使用X Window,GNOME和KDE也都是以X Window为基础建构成的。
  由于X只是工具包及架构规范,本身并无实际参与运作的实体,所以必须有人依据此标准进行开发撰写。如此才有真正可用、可执行的实体,始可称为实现体。当前依据X的规范架构所开发撰写成的实现体中,以X.Org最为普遍且最受欢迎。X.Org所用的协议版本,X11,是在1987年9月所发布。

二、X Window的组成

  X Window基于 Server/Clinet 架构,由三个部分组成:X Server、X Client和二者之间的通信通道。

在这里插入图片描述

1、X Server

  X Server是控制显示器和输入设备(键盘和鼠标)的程序。它接收输入设备的信息(鼠标点击、键盘输入等),将其传给X Client;将X Client传来的信息输出到屏幕上。X Server是一个管理显示的进程,必须运行在一个有图形显示能力的主机上。
  X Server只负责建立窗口,在其中写入文字或者画图,控制输入设备等,没有规范应用程序在用户界面上的具体细节设计,这些包括按钮、菜单和窗口的标题栏等等,这些都由窗口管理器(window manager)、GUI构件工具包、桌面环境(desktop environment)或者应用程序指定的GUI(如POS)等等的用户软件来提供。基于这种特性,在X的基础上,用户可以使用不同的窗口管理器和配套的应用软件、桌面环境,来体验不同风格的窗口外形、桌面设置与菜单。
  每一套显示设备只对应唯一的X Server,而X Server一般由系统供应商提供,通常无法被用户修改。对操作系统而言,X Server只是一个普通的用户程序而已,因此很容易更换新版本,甚至更换成第三方提供的原始程序,比如Linux下常用的Xorg、XFree86。并且,X Server并不局限于Linux系统,在Windows和Mac OS上也都有支持X Server的软件供下载使用,比如Windows下的MobaXterm、Xming、Xmanager,Mac Os下的XQuartz。

2、X Client

  X Client是应用程序的核心部分,它与硬件无关,每个应用程序就是一个X Client。X Client可以是终端仿真器(Xterm)或图形界面程序,它不直接对显示器绘制或者操作图形,而是与X Server通信,由X Server控制显示。多个X Client可以同时连接同一个X Server。
  Client无法直接影响视窗行为或显示效果,它们只能送一个请求(request)给Server,由Server来完成这些的请求。典型的请求通常是“在某个视窗中写‘Hello World’的字符串”,或者从A到B划一条直线。

3、通信通道

  X Client与X Server之间传输信息的媒介,X通信通道的主体是xlib(X函数库),通过xlib库,可以让X Client和X Server进行通信。Server和Client通信的方式大致有两类,对应于X系统的两种基本操作模式:

  • 第一类,Server和Client在同一台机器上执行,它们可以共同使用机器上任何可用的通信方式做互动式信息处理。在这种模式下,X可以同其他传统的视窗系统一样高效工作。
  • 第二类,Client在一台机器上运行,而显示器和Server则在另一台机器上运行。因此两者的信息交换就必须通过彼此都遵守的网络协议进行,最常用的协议为TCP/IP。这种通信方式一般被称为网络透明性,这也几乎是X独一的特性。

交互示例:

在这里插入图片描述

三、X Window的使用

1、DISPLAY环境变量

  在Linux/Unix类操作系统上, DISPLAY用来设置将图形显示到何处。当直接登陆图形界面,或者登陆命令行界面后使用startx启动图形界面时,DISPLAY环境变量将自动设置为:0:0, 可以使用 echo $DISPLAY 或者 printenv DISPLAY 命令输出DISPLAY环境变量的值。使用 xdpyinfo 命令可以查看到当前显示的更具体的信息。
  DISPLAY环境变量格式为 hostname:display_number.screen_number 。hostname 指X Server所在的主机主机名或者ip地址, 图形将显示在这一机器上。假如 hostname 为空, 则表示X Server运行于本机,并且X Client使用unix socket方式连接到X server, 而不是TCP方式。使用TCP方式连接时, display_number 为连接的端口减去6000的值, 假如display_number为0, 则表示连接到6000端口;使用unix socket方式连接时则表示连接的unix socket的路径, 假如为0, 则表示连接到/tmp/.X11-unix/X0 。 screen_number则几乎总是0。
  可以这样理解:一台计算机可以有多个 display,一个 display 可以有多个屏幕。所以,display 相当于是计算机配备的一套输入输出设备,一般情况下,一台电脑只配一套键盘鼠标和一个显示器,特殊情况下,可以配多个显示器。

2、在本地X Server中显示GUI程序

(1)查看当前正在运行的X Server

可以使用 ps -e | grep X 命令查看当前系统正在运行的X Server。

在这里插入图片描述

从上图可以看到,目前系统的X Server使用的是Xorg,运行在tty1上。

(2)启动新的X Server

  Linux 支持虚拟控制台,只需要同时按下 Ctrl+Alt+F1、Ctrl+Alt+F2、…、Ctrl+Alt+F7,就可以在不同的虚拟控制台中进行切换。从上图可以看到,当前系统的图形界面是在虚拟控制台1中运行的,所以我们要切换回当前系统图形界面时,需要同时按下 Ctrl+Alt+F1。
  我们可以使用X Server程序来启动 X Server。启动 X Server 的时候可以指定 display 参数,因为可以省略掉 hostname 和 screen_number,所以可以用 :0,:1 这样的格式来指定 display,由于:0已经被占用,所以可以使用:1。命令如下:

sudo X :1 -retro

启动效果如下,-retro选项是为了让 X Server 的背景显示为斜纹,便于区分,此时可以按下 Ctrl+Alt+F1切换回原来的控制台。

在这里插入图片描述

使用 ps -e | grep X 命令,可以看到此时在虚拟控制台7上也启动了Xorg,按下Ctrl+Alt+F7即可切换到tty7。

在这里插入图片描述

(3)在指定display中显示程序

我们可以在执行程序时添加–display参数来指定程序显示在哪个X Server上,以下使用gedit程序举例,将gedit界面显示在新建的X Server界面上,命令如下:

gedit --display :1

在这里插入图片描述

在这里插入图片描述

注:测试时发现,对于部分程序,如xarclock、xclock、xterm等,需要使用-display来指定,而不是–display。

(4)在指定display中显示程序的另一种方式

我们还可以采用设置DISPLAY环境变量的方式来指定显示程序的display。在系统启动进入图形界面后,会将DISPLAY默认设置为:0,表示默认都使用:0的display来进行显示。我们可以将DISPLAY值改为其他值,这样在终端中启动程序时将使用指定display来进行显示。

//临时设置DISPLAY环境变量,重启恢复
export DISPLAY=:1

3、在远程X Server中显示GUI程序

  基于X Window的网络透明性,可以通过TCP/IP协议,让X Client与远程X Server进行通信。我们可以使用两台Linux终端作为服务端和客户端,客户端通过ssh连接到服务端,将服务端上的程序显示在客户端的图形界面上。在以上流程中,客户端是作为X Server,而服务端作为X Client,这是因为客户端需要将服务端的程序显示在自身的界面上,需要负责远程服务端启动程序的绘制操作,所以作为X Server,而服务端则是需要把显示数据发送到客户端显示,所以作为X Client。

注1:使用ssh主要是为了方便操作,也可以直接在服务终端上进行操作,而不通过ssh来远程访问。
注2:服务端IP为192.168.12.60,对应X-Client;客户端IP为192.168.12.66,对应X-Server。

(1)启动X Server监听tcp

LightDM,即:Light Display Manager,是一个全新的、轻量的Linux桌面的桌面显示管理器,LightDM 负责启动 X Server 和其它的 X 程序。而LightDM在启动X Server时,默认给X Server添加了-nolisten tcp 参数,这会导致无法通过tcp方式访问到远程X Server。

在这里插入图片描述

这时候需要使用vim去修改/etc/lightdm/lightdm.conf 文件,将 xserver-allow-tcp=false 一行前面的注释去掉,并且改为 xserver-allow-tcp=true。

在这里插入图片描述

修改完成后,保存退出,然后重启系统,或者使用 service lightdm restart 命令重启lightdm服务,使配置生效,然后再使用ps命令查看Xorg的执行选项,就发现这时候执行选项变成了 -listen tcp 选项。

在这里插入图片描述

(2)X Server添加指定X Client的安全认证

远程访问X Server时,会需要进行安全认证,避免未认证的X Client可以随意访问远程X Server。X-Server端可配置基于IP级别的验证和基于共享key的验证,即使用xhost和xauth两种方式来实现安全认证。

xhost(基于IP验证)

  一个Displayer(X-Server)会对应一个xhost列表,在X-Client请求接入时, X-Server验证X-Client的IP是否在xhost列表中,若不在,则拒绝接入。需要使用xhost命令,在X-Server端将对应IP添加到xhost列表。
  xhost命令 是X服务器的访问控制工具,用来控制哪些X客户端能够在X服务器上显示。该命令必须从有显示连接的机器上运行。使用xhost命令可以添加和删除主机名或用户名,以允许连接到X服务器。

xhost [[+-]hostname ...]

使用示例:

//允许任何x client连接
xhost +

//只允许IP在xhost列表中的x client连接
xhost -

//将192.168.12.12添加到可访问列表
xhost [+] 192.168.12.12

//从可访问列表中删除该IP
xhost - 192.168.12.12

注:通过以上方式设置,重启失效。

xauth(基于预共享密钥验证)

  一个X-Server关联一个.Xauthority文件,一个.Xauthority文件可包含多个Displayer的预共享密钥。X-Server只使用他所关联的.Xauthority文件里自身Displayer的密钥记录。X-Client接入时会带上目标Displayer的密钥,X-Server验证该密钥是否与本地.Xauthority文件里配置的一致,若不一致则拒绝。所以需要在X-Server端和X-Client端配置一致的密钥,可以使用xauth命令,能够编辑和显示连接到X服务器的授权信息。

常用命令:

//列举出当前授权文件保存的授权信息条目,条目信息格式为 displayname protocolname hexkey
//其中 displayname 为DISPLAY名称,protocolname 为使用的授权协议,hexkey为对应的KEY值。
xauth list

//显示授权文件.Xauthority相关信息
xauth info

//添加指定条目到授权文件
xauth add displayname protocolname hexkey

//使用X服务器生成指定条目,此命令类似于add命令。 主要区别在于它不要求用户提供密钥数据,而是连接到 displayname 中指定的X服务器并使用 SECURITY 扩展来获取密钥数据以存储在授权文件中。 
//如果无法联系到服务器或者它不支持 SECURITY 扩展,则命令失败。 否则,使用给定协议的指定显示器的授权条目将添加到授权文件中。 
//仅由一个句点组成的协议名称被视为 MIT-MAGIC-COOKIE-1 的缩写。
/* 包含以下几个常用选项:
 * [trusted|untrusted]:客户端是否可信。使用此授权连接的客户端将像往常一样完全运行显示。 
 *             如果使用 untrusted,则使用此授权连接的客户端将被视为不受信任,并防止窃取或篡改属于受信任客户端的数据。
 * [timeout seconds]:指定此授权的有效时间(以秒为单位)。 如果授权未使用(没有客户端与其连接)的时间超过此时间段,服务器将清除授权,并且以后使用它进行连接的尝试将失败。若将时间设置为0,表示永不过期。 
 *             请注意,服务器完成的清除不会从授权文件中删除授权条目。 默认超时为 60 秒。
 * [group group-id]:指定使用此授权连接的客户端应属于的应用程序组。 
 * [data hexdata]:指定服务器应该用来生成授权的数据。 请注意,这与写入授权文件的数据不同。 此数据的解释取决于授权协议。 
 */
xauth generate displayname protocolname [trusted|untrusted] [timeout seconds] [group group-id] [data hexdata]

//以下命令表示,连接到:2对应的X Server来获取密钥数据,生成的授权条目使用MIT-MAGIC-COOKIE-1协议,永久有效且是受信任的。
xauth generate :2 . trusted timeout 0 

(3)采用xauth认证方式来访问远程X Server

使用以下命令,在客户端(对应X Server)生成对应的授权条目信息,其中192.168.12.66是本地IP,若提示No protocol specified,则表示无权限访问,使用 xhost + 192.168.12.66 命令赋予权限即可。

xauth generate 192.168.12.66:0 . timeout 0 trusted

在这里插入图片描述

使用以下命令通过ssh连接到远程服务器终端上,其中192.168.12.60是服务器IP地址,server是要登录的服务器用户名。

ssh [email protected]

在这里插入图片描述

使用xauth add命令,将前面客户端(对应X Server)生成的授权条目信息添加到服务端(对应X Client)的.Xauthority认证文件中。其中,要把displayname修改为IP地址,即192.168.12.66:0。

在这里插入图片描述

在远程服务器上设置display环境变量。

在这里插入图片描述

在远程服务器运行xarclock,能够正常显示GUI界面。

在这里插入图片描述

说明:
可以将X Client连接到远程IP的其他display上,例如192.168.12.66:2。具体步骤与上述操作类似,不过要注意以下几点:

  • 若使用X命令启动新的X Server,需要确保能够正常监听tcp端口,命令应该使用 sudo X :2 -retro -listen tcp 。
  • 启动新的X Server后,需要先在该X Server启动一个gui程序,例如使用 xterm -display :2 命令在该X Server界面启动xterm,否则后续拷贝生成的授权条目使用时会提示"Invalid MIT-MAGIC-COOKIE keyError:can’t open display"错误。
  • 在X Server端使用 xauth generate 192.168.12.66:2 . timeout 0 trusted 命令生成对应的授权条目,拷贝并添加到X Client的认证文件中,其中displayname使用192.168.12.66:2。
  • 在X Client端将DISPLAY环境变量设置为 192.168.12.66:2 后,运行的gui程序都能正常在192.168.12.66:2对应的屏幕中显示。

(4)采用xhost认证方式来访问远程X Server

在客户端(对应X Server)使用xhost命令添加服务器IP,以通过IP安全认证。

xhost + 192.168.12.60

使用ssh连接到服务端,并设置DISPLAY环境变量。

在这里插入图片描述

运行xarclock程序,能够正常显示。

在这里插入图片描述

说明:
通过xhost方式,远程在新启动的X Server中运行GUI程序方式如下:

  • 通过sudo X :2 -retro -listen tcp 命令启动X Server,运行后可以使用ps命令查看。

在这里插入图片描述

  • 使用xterm -display :2 命令在该X Server界面启动xterm,在该xterm中输入xhost + 192.168.12.60命令,将服务器IP添加到该X Server对应的xhost列表中。

在这里插入图片描述

  • 通过ssh连接到远程服务器(对应X Client),设置DISPLAY环境变量。

在这里插入图片描述

  • 运行xarclock程序,能够正常显示。

在这里插入图片描述

4、通过ssh的X11数据转发功能远程启动GUI程序

当我们使用ssh远程访问服务器时,可以通过启用X11数据转发的功能,来实现客户端远程访问并显示服务器端的GUI程序的功能,具体操作步骤如下:

(1)服务器端sshd启用X11转发

服务器端使用vim修改/etc/ssh/sshd_config的配置,确保 X11Forwarding yes,如果在配置文件里面没有找到,就直接添加到文件末尾即可,最后保存退出。

在这里插入图片描述

服务器端修改完成后需要执行命令重启sshd服务:

service sshd restart

(2)客户端ssh启用X11转发

客户端可以使用以下两种方式启用X11数据转发的功能:

  • 方式一:使用vim修改/etc/ssh/ssh_config的配置,确保 ForwardX11 yes,如果在配置文件里面没有找到,就直接添加到文件末尾即可,最后保存退出。

在这里插入图片描述

客户端修改完成后需要执行命令重启ssh服务:

service ssh restart
  • 方式二:使用ssh命令进行远程方式时,添加 -X 选项,就可以启用X11数据转发。

(3)客户端使用ssh访问服务器端GUI程序

使用以下命令远程访问服务器,若已经采用步骤(2)的方式一设置过,可以不用加-X选项。

ssh -X [email protected]

运行xarclock程序,能够正常显示。

在这里插入图片描述

此时输出DISPLAY环境变量和当前认证文件中的认证条目信息可以发现,此时DISPLAY环境变量已经被自动设置为localhost:10.0,并且本地授权文件中也自动添加了对应的授权信息。

在这里插入图片描述

参考

  1. X Window 的奥秘
  2. X Window系统
  3. X Window
  4. Linux下DISPLAY环境变量的作用
  5. X-Security X的安全控制

猜你喜欢

转载自blog.csdn.net/weixin_56291477/article/details/130431953