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

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

我有一个项目需要检测DISPLAY外壳内()变量能够显示一些本地机器上的东西。

或者更好的解决方案(?) 打开非交互式 shell 中的东西,无需尝试找出DISPLAYXAUTHORITY

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

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

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

或作为用户:

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

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

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

答案1

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

systemctl --user show-environment

显示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.
  • 除了 Xorg 之外,还可以有Xvfb其他东西。
  • 它可能是根本没有本地 Xorg 的远程会话。

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

/usr/lib/xorg/Xorg vt1 -displayfd 3 -auth /run/user/1000/gdm/Xauthority -background none -noreset -keeptty -verbose 3

-displayfd 3以某种方式指向DISPLAY.如果以 root 身份查看/proc/$(pidof Xorg)/fd/3我发现

    lrwx------ 1 root root 64 Mär  8 22:45 3 -> socket:[21437]

不过,我不知道如何寻找 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

Xorg.0.log是一个清晰的显示指示:0


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

答案2

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

- XAUTHORITY:

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

- DISPLAY:

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

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

基于

相关内容