각 사용자가 사용할 수 있는 모든 $DISPLAY 변수를 캡처하는 방법

각 사용자가 사용할 수 있는 모든 $DISPLAY 변수를 캡처하는 방법

$DISPLAY현재 사용자가 열려 있는 모든 변수를 가져오는 방법은 무엇입니까 ? 일반적으로 말하면 :0새 디스플레이를 열면 다른 변수가 설정됩니다.

$DISPLAY그렇다면 사용자가 사용할 수 있는 모든 변수를 어떻게 캡처합니까 ?

답변1

DISPLAYGNU/Linux에서 모든 프로세스에 대한 환경 변수 값을 얻으려면 다음을 수행할 수 있습니다.

LC_ALL=C sed -zn 's/^DISPLAY=//p' /proc/*/environ |
  LC_ALL=C sort -zu |
  tr '\0' '\n'

sed이 정보에 액세스하려면 as를 실행해야 합니다 root. 일반 사용자로 실행하면 해당 사용자로 실행 중인 프로세스에 대한 정보만 얻을 수 있습니다.

환경 문자열로 전달된 명령은 그래픽 X11 데스크톱 세션의 일부로 시작되었거나 X11을 요청한 원격 클라이언트의 요청 으로 시작되었기 때문에 DISPLAY=some-display-spec기본 X11 디스플레이 대상 환경에서 시작되었음을 의미합니다. 전송.some-display-specsshdssh

그러나 이는 명령을 실행하는 프로세스가 반드시 해당 서버에 연결하여 서비스를 요청(사용자와 상호 작용)한다는 것을 의미하지는 않습니다. 이는 아마도 다른 방식(예: 터미널 에뮬레이터의 중개를 통해)으로 사용자와 상호 작용하기 때문일 수 있습니다. ). 또는 오디오를 통해...) 또는 사용자와 전혀 상호 작용하지 않기 때문입니다. X11 서버에 연결할 수도 있지만 예를 들어 $DISPLAY/ /... 옵션 중 일부를 사용하여 다른 서버에 연결하라는 지시를 받기 때문에 해당 변수를 무시합니다. 또한 이러한 옵션을 사용하면 프로세스가 환경에 변수를 추가하지 않고도 X 서버에 연결할 수 있습니다.-display--display-dDISPLAY


Xorg사용 가능한 X11 디스플레이가 로컬에서( ,, ... 등을 통해) 제공되는지 확인하려면 sshdas 경로를 사용하여 Xvnc스트림 유형 추상화 또는 unix 도메인 소켓을 볼 수 있습니다./tmp/.X11-unix/X<number>

LC_ALL=C grep -Po '^(\S+ ){3}0*10000 (?1){3}@?/tmp/.X11-unix/X\K\d+$' /proc/net/unix |
  LC_ALL=C sort -u

tcp/localhost:0또는 6000( 표시용)부터 X 서버를 찾을 것으로 예상되는 6000 이상의 합리적인 숫자까지의 TCP 포트에서 :

ss -nlt 'sport >= 6000 && sport < 6030'

어떤 경우든, 특정 사용자가 이러한 서버에 연결하여 디스플레이 서비스를 요청할 수 있는지 여부는 액세스 제어가 구성된 방식에 따라 달라지며, 이는 다양한 방법으로 수행될 수 있으며 서버마다 다를 수 있습니다.

특정 X11 디스플레이에 대한 라이센스 설정을 쿼리하려면 다음을 수행할 수 있습니다.

DISPLAY=that-display xhost

하지만 이 명령이 성공하려면 디스플레이에 액세스할 수 있는 권한이 있어야 하기 때문에 약간 까다롭습니다.

답변2

나는 당신의 "에 대답하고 있습니다$DISPLAY사용자가 사용할 수 있는 모든 변수를 어떻게 캡처할 수 있나요 ?".

$DISPLAY다른 곳에 표시되도록 클라이언트를 항상 설정할 필요는 없습니다 . 예를 들어,

xclock -display :2

또한 애플리케이션이 원격 디스플레이에 액세스할 수도 있습니다.

xclock -display 192.168.1.55:0

제가 1990년대에 X 디스플레이 서버에서 작업할 당시에는 디스플레이 서버에서 수천 마일/킬로미터 떨어진 시스템에서 클라이언트를 실행하는 것이 가능했습니다.

따라서 사용자가 사용할 수 있는 모든 디스플레이 서버를 나열하는 것은 불가능합니다.특정 적용 가능한 표준 세트가 없는 한.

관련 정보