Як отримати номер відображення, який я призначив X


20

З 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.

Як я можу знайти присвоєний мені номер дисплея?

Або список поточно відкритих дисплеїв та їх користувачів?

Відповіді:


29

Якщо вам відомо про один ідентифікатор процесу, що працює в сеансі користувача, і у вас є дозвіл на доступ до інформації цього процесу, ви можете отримати його середовище за 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.


Примітка. Якщо ви хочете використовувати це в одному рядку, вам потрібно додати ;до done.
not2qubit

@ user1147688 дякую, але символ нового рядка працює так само добре, принаймні в оболонках, які я використовую (Bash and Dash).
Амір

Яскравий! Спасибі. Я вкрав це для unix.stackexchange.com/a/429162/12574 з деякими вдосконаленнями;)
Жил Кінот

11

На 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. Однак це рішення покладається виключно на той факт, що ядро ​​призначає нові ідентифікатори процесу у висхідній послідовності, що може бути не завжди.


Дякую, я думаю, що відповідь DISPLAY - це відповідь. Однак змінна DISPLAY може бути застарілою. Це сталося зі мною при повторному приєднанні до екранного сеансу. Це спричинило, що графічні речі не спрацювали. Я вирішив це, від’єднавши, повторюючи DISPLAY, повторно вставши та встановивши DISPLAY на нове значення.
ricab

Linux виставляє середовище кожного процесу під /proc/$pid/environ, як у cat /proc/$$/environ | tr '\0' '\n' | grep '^DISPLAY='. Дивіться мою відповідь для іншого прикладу використання.
Амір

2

У цій відповіді є однорівневий на основі who& grep

/ubuntu//a/230838/152287

who можна скоротити як w

ви можете прочитати більше за посиланням, включаючи однолінійний, щоб отримати значення.

Це працює. Ось rasberrypi (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

1

https://gitorious.org/termsql/pages/Home

termsql є хорошим інструментом для вилучення подібної інформації.

З'ясування номера DISPLAY - один із прикладів:

export DISPLAY=$(ps aux | termsql "select COL11 from tbl where COL10 like '%Xorg.bin%' limit 1")

(встановіть змінну середовища DISPLAY на те, що відображається X, який працює зараз, припускаючи, що виклик X двійковій називається Xorg.bin)


1

Невелика варіація відповіді Аміра.

ps eвиведе середовище кожної команди, розділене простір, щоб її можна було передати безпосередньо sedфільтруванню DISPLAY, даючи більш просту команду, ніж безпосередньо читання / proc / PID / оточення. (Однак для читання середовищ інших користувачів все ще потрібні права доступу до root.)

Цей код видасть імена всіх зареєстрованих користувачів з 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.