在非交互式 shell 中为当前用户查找当前 DISPLAY 和 XAUTHORITY 的最佳方法是什么?

Gil*_*not 4 xorg x11 display variable

我有一个项目需要检测DISPLAYin shell ( ) 变量才能在本地机器上显示一些内容。

或者更好的解决方案(?)在非交互式 shell 中打开东西,而无需试图弄清楚DISPLAYXAUTHORITY.

我可以设置,DISPLAY=:0但如果用户使用另一个会话,这将失败。

就我不处于交互模式而言,我尝试过的(效果很好,但仅限于 root)是:

strings /proc/$(pidof Xorg)/environ | grep -Eo 'DISPLAY=:[0-9]+(:[0-9])*'
Run Code Online (Sandbox Code Playgroud)

或作为用户:

ps uww $(pidof Xorg) | grep -oE '[[:blank:]]:[0-9]+(:[0-9])*\b'
Run Code Online (Sandbox Code Playgroud)

但我不知道它在任何 Linux(Unixes?)上是否可靠

有没有更可靠/便携的方式?

mvi*_*eck 5

在带有 init 系统systemd的发行版上,输出

systemctl --user show-environment
Run Code Online (Sandbox Code Playgroud)

显示DISPLAYXAUTHORITY。对于我的带有 systemd 和gdm3作为显示管理器的debian 9 系统来说,这至少是正确的。

陷阱:在startx xterm -- :2 vt2tty2 systemctl 上运行后给我DISPLAYXAUTHORITY从新显示;我的主显示器:0不再以这种方式观察。


其他方法:

至少因为XAUTHORITY解析输出ps aux | grep Xorg并查找 option更可靠-auth。在我的情况下,它位于/run/user/1000/gdm/Xauthority而不是在~/.Xauthority

陷阱:

  • 可以有多个 Xorg 实例。
  • 可以有Xwayland.
  • 可以有Xvfb或其他东西代替 Xorg 。
  • 它可能是一个完全没有本地 Xorg 的远程会话。

通常Xorg命令还包含显示编号。不幸的是,我的没有:

/usr/lib/xorg/Xorg vt1 -displayfd 3 -auth /run/user/1000/gdm/Xauthority -background none -noreset -keeptty -verbose 3
Run Code Online (Sandbox Code Playgroud)

-displayfd 3不知何故指向DISPLAY. 如果以 root 身份查看/proc/$(pidof Xorg)/fd/3我发现

    lrwx------ 1 root root 64 Mär  8 22:45 3 -> socket:[21437]
Run Code Online (Sandbox Code Playgroud)

虽然,我不知道如何寻找 socket 21437。我确定它指向/tmp/.X11-unix/X0. 一种方法是lsof +E -aUc Xorg显示有趣的输出:包含许多连接@/tmp/.X11-unix/X0和一个dbus连接。

有点脏:fd文件夹也显示给我

l-wx------ 1 root root 64 Mär  8 22:45 5 -> /var/log/Xorg.0.log
Run Code Online (Sandbox Code Playgroud)

Xorg.0.log是显示的明确指示:0


另一种方法:notify-send似乎聚集DISPLAYXAUTHORITY带有一些dbus魔法。但我不知道如何。如果至少有一个 dbus 守护进程正在运行,那可能是最干净和最便携的方式。


Gil*_*not 5

最终解决方案不需要 root,并且可以通过自动方式从非交互式 shell 访问,并且比之前提供的可能的重复链接更先进和可用:

- XAUTHORITY:

ps -u $(id -u) -o pid= |
  xargs -I{} cat /proc/{}/environ 2>/dev/null |
  tr '\0' '\n' |
  grep -m1 '^XAUTHORITY='
Run Code Online (Sandbox Code Playgroud)

- DISPLAY:

ps -u $(id -u) -o pid= |
  xargs -I{} cat /proc/{}/environ 2>/dev/null |
  tr '\0' '\n' |
  grep -m1 '^DISPLAY='
Run Code Online (Sandbox Code Playgroud)

该片段列出了所有用户的pids,迭代它们,然后在第一个匹配处中断

基于