비대화형 쉘에서 현재 사용자의 현재 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 및 디스플레이 관리자가 있는 데비안 9 시스템의 경우입니다.

함정: startx xterm -- :2 vt2tty2에서 실행한 후 systemctl이 표시 DISPLAY되고 XAUTHORITY다시 표시됩니다. 내 기본 모니터는 :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/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것 같습니다 . 하지만 어떻게 해야할지 모르겠습니다. 적어도 하나의 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하고 이를 반복한 다음 첫 번째 일치에서 중단됩니다.

기반으로이것

관련 정보