我想了解xauth
变量DISPLAY
以及如何ssh -X
自动生成DISPLAY
变量以及为什么选择这些值?我发现有些地方DISPLAY
手动设置也是不正确的。
这个输出的每一列是什么意思?
[root@serverdg ~]# xauth list
serverdg2/unix:11 MIT-MAGIC-COOKIE-1 87b515cf92e356b7702d3afd721f7fe1
serverdg2/unix:10 MIT-MAGIC-COOKIE-1 e8f9bfb5abac8757f4864656ce4f9bd1
serverdg/unix:12 MIT-MAGIC-COOKIE-1 7270008abd9f949a9b1af76c7742da9e
serverdg/unix:11 MIT-MAGIC-COOKIE-1 bb2f1768b445f372e5975d728579517e
serverdg/unix:10 MIT-MAGIC-COOKIE-1 475b9a6cbc7567b956511d5d2d27950b
为什么在本例中使用 like 为变量ssh -X
生成一个值?DISPLAY
10.0
[root@serverdg ~]# echo $DISPLAY
localhost:10.0
我所知道的是,我需要复制这些值xauth list
,DISPLAY
如果我将当前用户 user 更改为另一个用户 ( su - user
) 才能使用 X,因为这些值是在使用 进行新登录时生成的ssh
。
答案1
环境DISPLAY
变量告诉应用程序如何连接X服务器。 X 服务器是系统中在屏幕上显示窗口的部分。显示器是可以显示窗口的东西。
一个unix系统可以有多个显示器,例如在多个显示器上虚拟控制台,或在多个真实控制台,或者因为某些显示器是虚拟的,或者因为某些显示是通过网络访问的。ssh -X
通过网络将连接转发到远程显示器。
每个显示器都有一个编号。这些数字的目的只是为了区分显示器。:0
是显示编号 0,:1
是显示编号 1 等。显示编号的使用方式之一是它允许应用程序连接到 X 服务器:它用于计算某个名称套接字文件( /etc/.X11-unix/X0
, …) 或 X 服务器侦听的 TCP 端口号(6000 加显示号)。
.0
显示编号后面的部分是一个过时的概念。它是一个“屏幕”编号,其中一个显示器可以由多个屏幕组成,并且一个窗口绑定到一个特定的屏幕。在现代系统上,X 服务器呈现单个屏幕并允许应用程序窗口在监视器之间移动。相当于.:NUMBER
:NUMBER.0
冒号之前可以有机器名称。这允许应用程序和 X 服务器之间进行 TCP 通信。这种通信无法防止网络窥探和中间人攻击,因此在实际网络中大多不推荐使用这种通信,但在某些情况下可能很有用,例如在同一主机上运行的虚拟机之间的网络上。在实践中,如果两者都工作,则在功能上等同于(但可能在幕后使用更快的通信机制,并且可能只有其中一个工作,因为并非所有 X 服务器都在本地和通过 TCP 侦听;甚至在技术上可以有不同的服务器正在监听,但这可能是某个地方的配置错误)。localhost:NUMBER
:NUMBER
:NUMBER
localhost:NUMBER
:NUMBER
创建 X 显示的实体必须选择显示编号。 (它可以通过让服务器决定来做到这一点,但如果是这样,它需要找出服务器选择的数字以便为DISPLAY
应用程序设置。)大多数程序选择最低的可用数字,或者在某些配置中硬编码的数字文件。为了给物理显示留出空间,SSH 只选择从 10 开始的数字。
手动设置通常是不正确的,DISPLAY
因为只有创建显示的实体才能选择数字。例如,在 的情况下ssh -X
,即 SSH 本身。如果您DISPLAY
手动设置,则可能会得到错误的号码,或者可能会公布不存在的显示(例如,如果 X11 转发被拒绝)。
其他用户或其他计算机上的用户可能会尝试连接到不属于他们自己的 X 显示器。因为X被设计为允许远程连接,所以它不能仅仅依赖于unix用户。所以 X 有一个授权机制:当应用程序想要连接到X显示器时,它必须证明它是经过授权的。在现代世界中,只有一种授权机制,即“cookie”格式MIT-MAGIC-COOKIE-1
(16 字节,以十六进制表示)。 cookie 是一个长随机字符串,在服务器启动时生成并存储在只有合法用户才能读取的文件中。为了连接到 X 显示,应用程序必须将 cookie 值发送到服务器。如果 cookie 值不正确,服务器将拒绝连接。