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


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.