web-dev-qa-db-ja.com

現在のユーザーの非対話型シェルで現在のDISPLAYおよびXAUTHORITYを見つける最良の方法は何ですか?

ローカルマシン上で gui を表示できるようにするために、シェル( bash )変数でDISPLAYを検出する必要があるプロジェクトがあります。

または、DISPLAYXAUTHORITYを理解せずに非対話型シェルで gui を開くためのより良い解決策( dbus ?)。

DISPLAY=:0しかし、ユーザーが別のセッションを使用すると失敗します。

私がインタラクティブモードでない限り、私が試した(うまく機能しますが、ルートとしてのみ):

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?)でも信頼できるかどうかはわかりません。

より信頼できる/ポータブルな方法はありますか?

4
Gilles Quenot

rootである必要のない最終的なソリューションであり、自動化された方法で非インタラクティブシェルからアクセス可能であり、以前に提供された可能な複製リンクよりも高度で使用可能です:

-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をリストし、それらを反復して、最初の一致でブレークします

this に基づく

2
Gilles Quenot

Init system systemdのあるディストリビューションでは、

_systemctl --user show-environment
_

は、DISPLAYおよびXAUTHORITYを示しています。これは、systemdおよび_gdm3_をディスプレイマネージャーとして使用している私のdebian 9システムには少なくとも当てはまります。

落とし穴:tty2で_startx xterm -- :2 vt2_を実行した後、systemctlは新しいディスプレイからDISPLAYXAUTHORITYをくれました。私のメインディスプレイ_:0_は、このように観察できなくなりました。


その他のアプローチ:

少なくともXAUTHORITYの場合、_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]
_

しかし、ソケット_21437_を探す方法がわかりません。 _/tmp/.X11-unix/X0_を指していると確信しています。 1つのアプローチは、興味深い出力を示す_lsof +E -aUc Xorg_です。つまり、多くの接続が_@/tmp/.X11-unix/X0_と1つの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デーモンが実行されている場合は、これが最もクリーンで移植性の高い方法です。

5
mviereck