Чи є команда для переліку всіх відкритих дисплеїв на машині?


76

Коли SSH перебуває локально на моєму комп’ютері (не питайте, це вирішення проблеми), я не можу запустити графічні програми без запуску:

export DISPLAY=:0.0

Якщо я запускаю це спочатку, а потім запускаю графічний додаток, все виходить. Якщо ні, це не працює, немає екрана, до якого можна приєднатися.

Чи є команда для перерахування всіх доступних дисплеїв (тобто: усіх можливих значень) на машині?


Чистіший спосіб запуску програм з терміналу ( DISPLAY=:0 yourapp & ).
nobar

3
Щоб отримати цей номер відображення з сценарію командного рядка, спробуйте w. Більше інформації: перерахуйте наявні X-імена?
aexl

Відповіді:


80

Якщо ви хочете, щоб з'єднання X пересилалось через SSH, вам потрібно включити його як на стороні сервера, так і на стороні клієнта. (Залежно від дистрибутиву, він може бути включений або відключений за замовчуванням.) На стороні сервера переконайтеся, що ви перебуваєте X11Forwarding yesу /etc/sshd_config( /etc/ssh/sshd_configабо де б не був конфігураційний файл). На стороні клієнта передайте -Xпараметр sshкоманді або ForwardX11введіть свою ~/.ssh/config.

Якщо ви біжите ssh -X localhost, ви повинні побачити, що $DISPLAYце (мабуть) localhost:10.0. На відміну від цього :0.0, це значення, коли ви не підключені через SSH. ( .0Частина може бути опущена; це номер екрана, але кілька екранів використовуються рідко.) Є дві форми X-дисплеїв, з якими ви, швидше за все, стикаєтесь:

  • Локальні дисплеї, перед цим нічого немає :.
  • Відображається TCP з ім'ям хоста перед :.

З допомогою ssh -X localhostви можете отримати доступ до сервера X через обидва екрани, але програми використовуватимуть інший метод: :NUMBERдоступ до сервера через локальні сокети та спільну пам'ять, тоді як HOSTNAME:NUMBERдоступ до сервера через TCP, який повільніше і вимикає деякі розширення.

Зауважте, що вам потрібна форма авторизації для доступу до X-сервера, що називається файлом cookie і зазвичай зберігається поза кадром у файлі ~/.Xauthority. Якщо ви використовуєте ssh для доступу до іншого облікового запису користувача, або якщо ваш дистрибутив розміщує файли cookie в іншому файлі, ви можете виявити, що DISPLAY=:0він не працює в сеансі SSH (але ssh -Xбуде, якщо це включено на сервері; ви ніколи потрібно возитися, XAUTHORITYколи робите ssh -X). Якщо це проблема, вам потрібно встановити XAUTHORITYзмінну середовища або отримати файли cookie іншого користувача .

Щоб відповісти на власне запитання:

  • Локальні дисплеї відповідають розетці в /tmp/.X11-unix.

    (cd /tmp/.X11-unix && for x in X*; do echo ":${x#X}"; done)
    
  • Віддаленим дисплеям відповідають відкриті порти TCP вище 6000; доступ до номера дисплея N на машині M здійснюється шляхом підключення до порту TCP 6000 + N на машині M. Від самого машини M:

    netstat -lnt | awk '
      sub(/.*:/,"",$4) && $4 >= 6000 && $4 < 6100 {
        print ($1 == "tcp6" ? "ip6-localhost:" : "localhost:") ($4 - 6000)
      }'
    

    (Решта цього пункту питання є лише академічним.)

    На іншій машині ви можете nmap -p 6000-6099 host_nameзондувати відкриті порти TCP у звичайному діапазоні. В даний час дуже рідко X серверів слухати на TCP-розетці, особливо поза інтерфейсом зворотного зв'язку.

    Власне кажучи, інша програма може використовувати порт у діапазоні, який зазвичай використовують X-сервери. Ви можете визначити, чи слухає X-сервер, перевіривши, у якої програми відкритий порт.

    lsof -i -n | awk '$9 ~ /:60[0-9][0-9]$/ {print}'
    

    Якщо це показує щось неоднозначне на кшталт sshd, немає способу точно знати, чи це X-сервер чи збіг.


15

Дисплей - це перший аргумент Xorg. psПотім ви можете поздоровитись Xorg.

[braga@coleman teste_geom]$ ps aux | grep Xorg
root      1584  5.3  1.0 156628 41708 tty1     Rs+  Jul22  22:56 /usr/bin/Xorg :0 -background none -verbose -auth /var/run/gdm/auth-for-gdm-a3kSKB/database -nolisten tcp vt1
braga     9110  0.0  0.0 109104   804 pts/1    S+   00:26   0:00 grep --color=auto Xorg

Потім ви можете awkце зробити у будь-якому форматі.


10
Це не виявляє дисплеї, створені сервером, відмінним від Xorg, наприклад Xvnc .
cjm

5
ps aux |grep Xпрацював для мене краще
nobar

6
wпоказує всіх, хто ввійшов у систему та їх відображення.
Пленус Френклі

2
Зауважте, що аргумент Xorg (принаймні зараз, у 2016 році) необов’язковий і (принаймні, у Fedora) зазвичай відсутній, тому цей метод більше не працює.
BRPocock

Якщо з якихось причин просто встановити середовище var не завжди спрацює ... спробуйте попередньо встановити його для команди DISPLAY=:0 netsurf "https://medium.com/"... або використовувати export DISPLAY=:0для того, щоб поділити var з процесом, а не лише оболонкою
Ray Foss

7
# Show all active login shells, with displays
$ w -oush

trunc-us tty1                      23:02  -bash
trunc-us tty7     :0                4days /sbin/upstart --user
trunc-us pts/4    :0                      w -oush

# Capture the Display part
$ w -oush | grep -Eo ' :[0-9]+'

 :0
 :0

# only unique lines
$ w -oush | grep -Eo ' :[0-9]+' | uniq

 :0

# trim off the leading space
$ w -oush | grep -Eo ' :[0-9]+' | uniq | cut -d \  -f 2

[Редагувати: я запустив екземпляр Xnest, щоб побачити, чи не зачепиться це - це не так; він лише фіксує оболонки для входу ("w" - короткий термін "хто"). Назад до дошки для малювання для мене.] [Редагувати: Знайшов:

$ ls /tmp/.X11-unix

X0 X2

$ ls /tmp/.X11-unix | tr 'X' ':'
:0
:2

]


1
Це ... дивно ... Цікаво, яке там пояснення.
Форді

(стосовно GDM, що працює на дисплеї 1024 для мене), я не міг повторити його вдруге. У той час я випробовував xrdp, переглядав X11 переадресацію та кілька клієнтів VNC. Здається, що в типовій установці GDM буде працювати на X0 ... або X1, якщо ви натиснули кнопку "Увійти як інший користувач" на екрані блокування. Ваш другий метод працював для мене на Fedora 23
Ray Foss,

Я знайшов щось на Дисплеї 1024 за допомогою вашої команди, але я нічого не бачу там ... використовуючи ps xeww | grep DISPLAY=:1024тепер це wierd. Я запускаю хром-віддалений робочий стіл на дисплеї 20 також.
Рей Фосс

wне працює, якщо на сервері x не запущено жодної програми (включаючи відсутність менеджера вікон та робочого столу). Але ls /tmp/.X11-unixпрацює.
12431234123412341234123

3
ps e | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u

зробить цю роботу, перерахувавши всі поточні DISPLAY. Також ви можете побачити призначені дисплеї для конкретного користувача ($ usr) за допомогою:

ps e -u $usr | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u

Це другий мав бути ps e -u $USER | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u?
Алекс Рош

0

У /tmpпапці також можуть бути .X??-lockфайли із ??зазначенням номерів сеансу.

Їх потрібно видалити, якщо ви хочете повторно використовувати номер сеансу.

Ви можете бачити їх, використовуючи, ls -aяк зазвичай, файли, що починаються з a ., приховані.


Це сеанси показу?
phk
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.