X (7) 매뉴얼 페이지에서
DISPLAY NAMES
From the user's perspective, every X server has a display name of the form:
hostname:displaynumber.screennumber
[...]
displaynumber
[...]
To avoid confusion, each display on a machine is assigned a display
number (beginning at 0) when the X server for that display is started.
할당 된 표시 번호를 어떻게 찾을 수 있습니까?
아니면 현재 열려있는 디스플레이와 사용자를 나열 하시겠습니까?
답변
사용자 세션에서 실행중인 하나의 프로세스 ID를 알고 있고 해당 프로세스 정보에 액세스 할 수있는 권한이 있으면 해당 환경에 DISPLAY
변수 를 추가 할 수 있습니다 .
cat /proc/$pid/environ | tr '\0' '\n' | grep '^DISPLAY='
예를 들어, 현재 컴퓨터에서 UID가 사용하는 모든 기본 디스플레이를 나열하려면 다음을 사용하십시오.
ps -u $(id -u) -o pid= | \
while read pid; do
cat /proc/$pid/environ 2>/dev/null | tr '\0' '\n' | grep '^DISPLAY=:'
done | grep -o ':[0-9]*' | sort -u
하나의 X 세션에만 로그인 한 경우 위와 같이 한 줄만 출력해야합니다 :0
.
답변
X 세션에서는 항상 DISPLAY
환경 변수를 참조하여 현재 표시 번호 ( echo $DISPLAY
) 를 얻을 수 있습니다 .
다른 사람의 표시 번호를 찾는 것이 더 어렵습니다. 나는 연결된 모든 사용자에게 묻는 것 이외의 정보를 얻는 표준 방법이 없다고 생각 하므로이 정보를 얻으려면 해커가 필요하며 모든 경우에 작동하지는 않습니다.
SE 에는 다른 옵션이 있지만 Debian Wheezy에서는 작동하지 않습니다. 그러나 위에 링크 된 게시물에 표시된 것처럼 현재 활성화 된 디스플레이를 나열하는 것은 쉽습니다.
ps axu | grep "X "
다음과 같이 현재 실행중인 X 프로세스를 표시합니다.
root 2354 0.0 0.5 23380 18292 tty8 Ss+ Sep15 2:36 /usr/bin/X :1 vt8 -br -nolisten tcp -auth /var/run/xauth/A:1-7xlyuc
root 7901 0.0 0.3 17044 12072 tty7 Ss+ Sep14 5:58 /usr/bin/X :0 vt7 -br -nolisten tcp -auth /var/run/xauth/A:0-wckh0a
다음의 첫 번째 매개 변수 /usr/bin/X
는 콜론이 앞에 붙은 표시 번호이고 다음 매개 변수 는 세션에 지정된 가상 터미널을 보여줍니다.
그러나 프로세스 목록을 보면 다음과 같은 답변을 얻을 수 있습니다.
ps axu |grep -3 "X "
root 1990 0.0 0.0 0 0 ? S Sep14 0:00 [kjournald]
root 1991 0.0 0.0 0 0 ? S Sep14 0:00 [kjournald]
root 1992 0.0 0.0 0 0 ? S Sep14 0:00 [kjournald]
root 2354 0.0 0.5 23380 18292 tty8 Ss+ Sep15 2:36 /usr/bin/X :1 vt8 -br -nolisten tcp -auth /var/run/xauth/A:1-7xlyuc
root 2359 0.0 0.0 5264 2228 ? S Sep15 0:00 -:1
user_1 2378 0.0 0.0 4920 1348 ? Ss Sep15 0:00 /bin/sh /usr/bin/startkde
user_1 2443 0.0 0.0 3868 348 ? Ss Sep15 0:00 /usr/bin/ssh-agent env TMPDIR=/var/tmp /usr/bin/dbus-launch --exit-with-session /usr/bin/openbox-kde-session
--
root 7500 0.0 0.0 6460 1080 ? Ss Sep14 0:00 /usr/sbin/sshd
ntp 7841 0.0 0.0 5352 1760 ? Ss Sep14 0:17 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 108:111
root 7882 0.0 0.0 3964 716 ? Ss Sep14 0:00 /usr/bin/kdm -config /var/run/kdm/kdmrc
root 7901 0.0 0.3 17044 12072 tty7 Ss+ Sep14 5:59 /usr/bin/X :0 vt7 -br -nolisten tcp -auth /var/run/xauth/A:0-wckh0a
root 7906 0.0 0.0 5260 2224 ? S Sep14 0:00 -:0
user_2 7925 0.0 0.0 12924 1560 ? Ssl Sep14 0:00 /usr/bin/lxsession -s LXDE -e LXDE
user_2 7990 0.0 0.0 3868 348 ? Ss Sep14 0:00 /usr/bin/ssh-agent env TMPDIR=/var/tmp /usr/bin/dbus-launch --exit-with-session /usr/bin/startlxde
라인에서 봐 후 /usr/bin/X
-는 X 세션이 시작, 창 관리자는 일반적으로 세션에 속한 사용자로 시작, 당신은 사용자 이름을 거기로. 필자의 경우 user_1은 KDE를 사용하고 user_2는 LXDE를 사용하고 있습니다. 그러나이 솔루션은 커널이 새로운 프로세스 ID를 오름차순으로 할당한다는 사실에 전적으로 의존하며, 항상 그런 것은 아닙니다.
답변
이 답변에는 who
& grep를 기반으로 한 라이너가 있습니다.
who
로 약칭 될 수있다 w
하나의 라이너를 포함한 링크에서 더 많은 것을 읽을 수 있습니다.
효과가있다. 다음은 raspberrypi (rasbian) 출력입니다. 여기서 표시 값은 FROM 열에 있습니다.
tim@raspberrypi:~ $ w
19:19:30 up 8:15, 2 users, load average: 0.12, 0.11, 0.09
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
pi tty7 :0 11:04 8:15m 1:15 0.89s /usr/bin/lxsess
tim pts/0 192.168.0.29 19:17 0.00s 1.00s 0.09s w
답변
https://gitorious.org/termsql/pages/Home
termsql
그런 정보를 추출하는 좋은 도구입니다.
DISPLAY 번호를 찾는 것이 예제 중 하나입니다.
export DISPLAY=$(ps aux | termsql "select COL11 from tbl where COL10 like '%Xorg.bin%' limit 1")
(X 바이너리가라고 가정하고 DISPLAY 환경 변수를 디스플레이 X가 현재 실행중인 것으로 설정하십시오 Xorg.bin
)
답변
Amir의 답변에 약간의 변형이 있습니다.
ps e
sed
/ proc / PID / environ을 직접 읽는 것보다 간단한 명령을 제공하여 DISPLAY를 필터링 하기 위해 직접 전달할 수 있도록 각 명령의 환경을 공백으로 구분하여 출력합니다 . (다른 사용자의 환경을 읽으려면 여전히 루트 권한이 필요합니다.)
이 코드는 X 세션을 가진 모든 로그인 한 사용자의 이름과 DISPLAY 번호를 출력합니다.
#!/bin/bash
declare -A disps usrs
usrs=()
disps=()
for i in $(users);do
[[ $i = root ]] && continue # skip root
usrs[$i]=1
done # unique names
for u in "${!usrs[@]}"; do
for i in $(sudo ps e -u "$u" | sed -rn 's/.* DISPLAY=(:[0-9]*).*/\1/p');do
disps[$i]=$u
done
done
for d in "${!disps[@]}";do
echo "User: ${disps[$d]}, Display: $d"
done