DISPLAY和X Window System

一、X Window System

X Window System采用C/S结构,但和我们常见的C/S不同。常见的C/S结构中,称提供服务的一方为server,即服务器端(如HTTP服务,FTP服务等),使用服务的称为client,即客户端。但在X Window System中,client是执行程序的一方,在上面执行各种X程序,而server则是负责显示client运行程序的窗口的一方。
X Window System的组成可以分为X server,X client,X protocol三部分。X server主要控制输入输出,维护字体,颜色等相关资源。它接受输入设备的输入信息并传递给X client,X client将这些信息处理后所返回的信息,也由X server负责输出到输出设备(即我们所见的显示器)上。X server传递给X client的信息称为Event,主要是键盘鼠标输入和窗口状态的信息。X client传递给X server的信息则称为Request,主要是要求X server建立窗口,更改窗口大小位置或在窗口上绘图输出文字等。X client主要是完成应用程序计算处理的部分,并不接受用户的输入信息,输入信息都是输入给X server,然后由X server以Event的形式传递给X client(这里感觉类似Windows的消息机制,系统接收到用户的输入信息,然后以消息的形式传递给窗口,再由窗口的消息处理过程处理)。X client对收到的Event进行相应的处理后,如果需要输出到屏幕上或更改画面的外观等,则发出Request给X server,由X server负责显示。

常见的情况是X server与X client都在同一台电脑上运行,但他们也可分别位于网络上不同的电脑上。在X Window System中,X client是与硬件无关的,它并不关心你使用的是什么显卡什么显示器什么键盘鼠标,这些只与X server相关。[1]

小结:X Window System由X server X client和 X protocol三部分组成,与普通的C/S架构不同,服务器并不运行程序,只接收鼠标、键盘等输入信息并将其转发给X client,X client收到信息(event)后客户端经过对应的计算后(执行程序)计算出显示变化后发回给X server(Request),指导位于服务器的X server绘制显示。X server负责接收鼠标、键盘信息的好处在于可以在远程操作应用程序(Qt)并且显示程序。一个Qt程序调整大小是如何进行的?

  • X server接受鼠标的点击和拖动信息
  • X server发送event信息给X client
  • X client计算出拖动量、显示更新量回传 Request
  • X server收到Request重新绘制显示内容

二、SSH和X Window System

假如有一台电脑位于美国洛杉矶,有了X Window System架构,身在中国广东的我也可以操作位于美国的电脑对应的硬件资源。洛杉矶既有X Server也有X client,如果要在广东控制洛杉矶的电脑,那么我们必须要在广东建立一个X server用于接受坐在电脑前的我的鼠标、键盘信息。

X forwarding是X的一个功能,它可以让程序运行在一台主机上,而用户在另外一台机器上与之交互。其概念上与VNC和微软的远程桌面类似,而与这些软件不同,我们想要实现的是在Microsoft Windows平台运行特定的图形用户界面程序,而不是显示控制整个桌面。在X上下文中,客户端“client”是指运行程序的主机,而你坐在服务器“Server”前面,这点和常规的叫法不同。举例来说,你通过A远程打开B上面的程序,也就是说你在操作A,而你要远程控制B,那么B就是客户端,A是服务端。

SSH 的 X11 forwarding 特性可以使 X client 和 X server 安全地通讯。使用 X11 forwarding 后,从 X client 到 X Server 方向的数据先被送至 SSH server,SSH server 利用和 SSH client 的安全通道转发给 SSH client,再由 SSH client 转发给 X server,从 X server 到 X client 的数据流同理。这里 SSH server 和 SSH client 充当了 X client 和 X server 间数据的转发器,由于 SSH server 和 X client、SSH client 和 X server 一般在同一台机器上,它们之间是一种安全的进程间通讯,而 SSH server 和 SSH client 间的通讯也是安全的,所以 X client 和 X server 间的通讯就是安全的[2]

2.1 SSH设置

  • Server 端 (/etc/ssh/sshd_config)
    完成这一设置需要对服务端ssh和客户端ssh进行相关的设置,如果你的洛杉矶的电脑没有安装ssh服务端,请使用命令:
sudo apt-get install openssh-server

确认选项X11Forwarding设置为yes:
在这里插入图片描述

  • Client端(/etc/ssh/ssh_config)

在这里插入图片描述
部分选项的解释:

  • X11DisplayOffset
    指定 sshdX11 转发的第一个可用的显示区(display)数字。默认值是 10 。
    这个可以用于防止 sshd 占用了真实的 X11 服务器显示区,从而发生混淆。

  • X11Forwarding
    是否允许进行 X11 转发。默认值是"no",设为"yes"表示允许。
    如果允许X11转发并且sshd代理的显示区被配置为在含有通配符的地址(X11UseLocalhost)上监听。
    那么将可能有额外的信息被泄漏。由于使用X11转发的可能带来的风险,此指令默认值为"no"。
    需要注意的是,禁止X11转发并不能禁止用户转发X11通信,因为用户可以安装他们自己的转发器。
    如果启用了 UseLogin ,那么X11转发将被自动禁止。

  • X11UseLocalhost
    sshd 是否应当将X11转发服务器绑定到本地loopback地址。默认值是"yes"。
    sshd 默认将转发服务器绑定到本地loopback地址并将 DISPLAY 环境变量的主机名部分设为"localhost"。
    这可以防止远程主机连接到 proxy display 。不过某些老旧的X11客户端不能在此配置下正常工作。
    为了兼容这些老旧的X11客户端,你可以设为"no"。

    扫描二维码关注公众号,回复: 13038527 查看本文章

在广东的我们可以使用ssh -X user@hostname登陆并让接下来洛杉矶运行的程序的图形界面都显示在广东。

DISPLAY变量

DISPLAY变量在X Window system由下面三个基本部分:

  • 键盘
  • 鼠标
  • 屏幕

DISPLAY变量常被X11用来识别你的显示器及鼠标键盘。其值常常是:0,表示电脑的主屏幕。当我们使用带X选项登陆SSH,当前登陆的终端的DISPLAY的值将会是localhost:10:0之类数值,X应用根据这个数值,将图形输入输出发送到TCP端口127.0.0.1:6010,然后SSH将会发回你的原主机(也就是你终端所处的位置),这个过程被称为forward back

[1] https://www.cnblogs.com/super119/archive/2010/12/18/1910065.html
[2] https://blog.csdn.net/defeattroy/article/details/7466018
[3] localhost在/etc/hosts中有定义,其实就是127.0.0.1

猜你喜欢

转载自blog.csdn.net/weixin_39258979/article/details/115319488