如何捕获每个用户可用的所有 $DISPLAY 变量

fau*_*uve 3 x11 environment-variables

如何获取$DISPLAY用户当前打开的所有变量?\n一般来说是\xe2\x80\x99s :0,但如果他打开一个新的显示,则会设置另一个变量。

\n

那么如何捕获$DISPLAY用户可用的所有可用变量呢?

\n

Sté*_*las 6

在 GNU/Linux 上,要获取DISPLAY所有进程的环境变量的值,您可以执行以下操作:

LC_ALL=C sed -zn 's/^DISPLAY=//p' /proc/*/environ |
  LC_ALL=C sort -zu |
  tr '\0' '\n'
Run Code Online (Sandbox Code Playgroud)

sed需要运行 asroot才能访问该信息。如果以普通用户身份运行,您将只能获取以该用户身份运行的进程的信息。

作为环境字符串传递给它的命令DISPLAY=some-display-spec意味着它是在首选 X11 显示目标的环境中启动的some-display-spec,例如因为它是作为图形 X11 桌面会话的一部分启动的,或者是sshd由请求sshX11 转发的远程客户端的请求。

但这并不一定意味着运行该命令的进程一定会连接到该服务器来请求其服务(与用户交互),可能是因为它以其他方式与用户交互(例如通过终端仿真器的中介)终端应用程序,或通过音频...),或者因为它根本不与用户交互。它还可以连接到 X11 服务器,但忽略该变量,因为例如它被告知使用某些/ / ... 选项$DISPLAY连接到另一个服务器。通过这些选项,您还可以让进程连接到 X 服务器,而无需在其环境中添加任何变量。-display--display-dDISPLAY


要找出本地提供的可用 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
Run Code Online (Sandbox Code Playgroud)

或者在 TCP 端口上从 6000(用于tcp/localhost:0显示)到 6000 以上的合理数字,您希望在其中找到 X 服务器:

ss -nlt 'sport >= 6000 && sport < 6030'
Run Code Online (Sandbox Code Playgroud)

在任何情况下,特定用户是否能够连接到这些服务器并向其请求显示服务将取决于如何配置访问控制,这些访问控制可以通过多种方式完成,并且因服务器而异。

要查询给定 X11 显示器的授权设置,您可以执行以下操作:

DISPLAY=that-display xhost
Run Code Online (Sandbox Code Playgroud)

但这有点棘手,因为您需要获得访问该显示的授权才能使该命令成功。