Есть ли команда для отображения списка всех открытых дисплеев на компьютере?

76

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

export DISPLAY=:0.0

Если я запускаю это сначала, а затем запускаю графическое приложение, все получается. Если нет, это не работает, нет дисплея для прикрепления.

Существует ли команда для отображения всех доступных дисплеев (т.е. всех возможных значений) на компьютере?

Нафтули Кей
источник
Более чистый способ запуска приложений из терминала ( DISPLAY=:0 yourapp & ).
Нобар
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переменную окружения или получить куки другого пользователя .

Чтобы ответить на ваш актуальный вопрос:

  • Локальные дисплеи соответствуют сокету в /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это в любом формате, в котором вам нужно.

Vitor Py
источник
10
Это не обнаруживает дисплеи, созданные сервером, отличным от Xorg, например Xvnc .
CJM
5
ps aux |grep Xработал лучше для меня
Нобар
6
wпоказывает всех, кто вошел в систему и их отображение.
Пленус Франкли
2
Обратите внимание, что аргумент Xorg является (по крайней мере, сейчас, в 2016 году) необязательным и (по крайней мере, в Fedora) обычно отсутствует, поэтому этот метод больше не работает вообще.
BRPocock
Если по какой-то причине просто установка среды var не всегда будет работать ... попробуйте добавить ее к команде DISPLAY=:0 netsurf "https://medium.com/"... или использовать, export DISPLAY=:0чтобы поделиться переменной var с процессом, а не только с оболочкой
Рэй Фосс
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

]

Fordi
источник
1
Это ... странно ... Интересно, что это за объяснение?
Форди
(в отношении GDM, работающего на дисплее 1024 для меня) Я не мог повторить его во второй раз. В то время я пробовал xrdp, оконную пересылку X11 и несколько клиентов VNC. Кажется, что в типичной установке GDM будет работать на X0 ... или X1, если вы нажмете кнопку "войти в систему как другой пользователь" на экране блокировки. Ваш второй метод сработал для меня на Fedora 23
Рэй Фосс
Я нашел что-то на Дисплее 1024, используя вашу команду, но я не вижу там ничего запущенного ... используя ps xeww | grep DISPLAY=:1024теперь это странно. Я запускаю Chrome-Remote-Desktop на дисплее 20, а.
Рэй Фосс
wне работает, если на сервере x не запущено ни одно приложение (в том числе нет оконного менеджера и рабочего стола). Но ls /tmp/.X11-unixработает.
12431234123412341234123
4
ps e | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u

сделает работу, перечислив все текущие дисплеи. Также вы можете увидеть назначенные дисплеи для конкретного пользователя ($ usr) с:

ps e -u $usr | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u
lenroc
источник
Это второй должен быть ps e -u $USER | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u?
Алекс Роше
0

В /tmpпапке также могут быть .X??-lockфайлы с ??указанием номеров сессий.

Вам необходимо удалить их, если вы хотите повторно использовать номер сеанса.

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

user177936
источник
Это сеансы дисплея?
PhK