![如何捕获每个用户可用的所有 $DISPLAY 变量](https://linux22.com/image/202938/%E5%A6%82%E4%BD%95%E6%8D%95%E8%8E%B7%E6%AF%8F%E4%B8%AA%E7%94%A8%E6%88%B7%E5%8F%AF%E7%94%A8%E7%9A%84%E6%89%80%E6%9C%89%20%24DISPLAY%20%E5%8F%98%E9%87%8F.png)
如何获取$DISPLAY
用户当前打开的所有变量?一般来说,:0
但如果他打开一个新的显示,则会设置另一个变量。
那么如何捕获$DISPLAY
用户可用的所有可用变量呢?
答案1
在 GNU/Linux 上,要获取DISPLAY
所有进程的环境变量的值,您可以执行以下操作:
LC_ALL=C sed -zn 's/^DISPLAY=//p' /proc/*/environ |
LC_ALL=C sort -zu |
tr '\0' '\n'
sed
需要运行 asroot
才能访问该信息。如果以普通用户身份运行,您将只能获取以该用户身份运行的进程的信息。
作为环境字符串传递给它的命令DISPLAY=some-display-spec
意味着它是在首选 X11 显示目标的环境中启动的some-display-spec
,例如因为它是作为图形 X11 桌面会话的一部分启动的,或者是sshd
由ssh
请求 X11 转发的远程客户端的请求。
但这并不一定意味着运行该命令的进程一定会连接到该服务器来请求其服务(与用户交互),可能是因为它以其他方式与用户交互(例如通过终端仿真器的中介)终端应用程序,或通过音频...),或者因为它根本不与用户交互。它还可以连接到 X11 服务器,但忽略该变量,因为例如它被告知使用某些/ / ... 选项$DISPLAY
连接到另一个服务器。通过这些选项,您还可以让进程连接到 X 服务器,而无需在其环境中添加任何变量。-display
--display
-d
DISPLAY
要找出本地提供的可用 X11 显示(通过Xorg
, sshd
, ... 等),您可以使用as 路径Xvnc
查看流类型抽象或 unix 域套接字:/tmp/.X11-unix/X<number>
LC_ALL=C grep -Po '^(\S+ ){3}0*10000 (?1){3}@?/tmp/.X11-unix/X\K\d+$' /proc/net/unix |
LC_ALL=C sort -u
或者在 TCP 端口上从 6000(用于tcp/localhost:0
显示)到 6000 以上的合理数字,您希望在其中找到 X 服务器:
ss -nlt 'sport >= 6000 && sport < 6030'
在任何情况下,特定用户是否能够连接到这些服务器并向其请求显示服务将取决于如何配置访问控制,这些访问控制可以通过多种方式完成,并且因一台服务器而异。
要查询给定 X11 显示器的授权设置,您可以执行以下操作:
DISPLAY=that-display xhost
但这有点棘手,因为您需要获得访问该显示的授权才能使该命令成功。
答案2
我正在回答你的“如何捕获$DISPLAY
用户可用的所有可用变量?”。
您并不总是需要设置$DISPLAY
在其他地方显示客户端。例如,
xclock -display :2
此外,应用程序有可能访问远程显示器,
xclock -display 192.168.1.55:0
当我在 20 世纪 90 年代研究 X 显示服务器时,很有可能在距离显示服务器数千英里/公里的系统上运行客户端。
因此,无法列出用户可用的所有可能的显示服务器除非您有一套特定的适用标准。