非対話型シェルで現在のユーザーの現在のDISPLAYとXAUTHORITYを見つけるための最良の方法は何ですか? [コピー]

非対話型シェルで現在のユーザーの現在のDISPLAYとXAUTHORITYを見つけるための最良の方法は何ですか? [コピー]

DISPLAYシェルの内部を検出する必要があるプロジェクトがあります()変数は一部を表示できます。ローカルコンピュータに何かがあります。

またはより良いソリューション(? )開いているDISPLAY合計を調べようとせずに非対話型シェルにありますXAUTHORITY

設定できますが、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(Unixes?)でも信頼できるのかはわかりません。

より信頼性が高く携帯可能な方法はありますか?

答え1

init システムがあるディストリビューションでは、出力systemdは次のようになります。

systemctl --user show-environment

マークDISPLAYXAUTHORITY。少なくともgdm3systemdとディスプレイマネージャを持つDebian 9システムの場合。

トラップ:startx xterm -- :2 vt2tty2で実行した後、systemctlが表示され、DISPLAYXAUTHORITY表示されます。私のデフォルトのモニターは:0もはや同じではありません。


他の方法:

少なくともXAUTHORITY、出力を解析してオプションを見つけることps aux | grep Xorgがより安定しています-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で見る場合。/proc/$(pidof Xorg)/fd/3

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

しかし、ソケットを見つける方法がわかりません21437/tmp/.X11-unix/X0一つの方法はlsof +E -aUc Xorg興味深い結果を示すことです。多くの接続には@/tmp/.X11-unix/X01つの接続が含まれています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です。しかし、どうすればいいのかわかりません。少なくとも1つのdbusデーモンが実行されている場合、これはおそらく最もクリーンで移植性の高い方法です。DISPLAYXAUTHORITYdbus

答え2

最終的なソリューションはルートを必要とせず、自動化された方法で非対話型シェルからアクセスでき、ソリューションよりはるかに高速です。冗長性以前に提供されたリンク:

- 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それを繰り返し、最初の一致で中断されます。

に基づいてこれ

関連情報