X11

在目前使用者的非互動式 shell 中找到目前 DISPLAY 和 XAUTHORITY 的最佳方法是什麼?

  • March 21, 2018

我有一個項目需要檢測DISPLAYin shell ( bash ) 變數,以便能夠在本地機器上顯示一些gui內容。

或者更好的解決方案(dbus?)在非互動式 shell 中打開gui的東西,而不用試圖找出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(Unix 系統?)上是否可靠

有沒有更可靠/便攜的方式?

最終解決方案不需要 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,遍歷它們,然後在第一個匹配時中斷

基於

在具有 init 系統systemd的發行版上,輸出

systemctl --user show-environment

顯示DISPLAYXAUTHORITYgdm3對於我的帶有 systemd 並作為顯示管理器的 debian 9 系統來說,這至少是正確的。

陷阱:在startx xterm -- :2 vt2tty2 上執行後 systemctl 給了我DISPLAYXAUTHORITY從新顯示;我的主顯示器:0不再以這種方式被觀察到。


其他方法:

至少解析輸出並查找 optionXAUTHORITY更可靠。就我而言,它位於而不是位於。ps aux | grep Xorg``-auth``/run/user/1000/gdm/Xauthority``~/.Xauthority

陷阱:

  • 可以有多個 Xorg 實例。
  • 代替 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 守護程序正在執行,那麼這可能是最乾淨和最便攜的方式。

引用自:https://unix.stackexchange.com/questions/429092