it-swarm-ru.tech

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

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

export DISPLAY=:0.0

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

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

78
Naftuli Kay

Если вы хотите, чтобы 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 на машине М осуществляется путем подключения к TCP порт 6000 + N на машине М. От Сама машина М:

    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 сервер или совпадение.

85
Gilles 'SO- stop being evil'

Отображение является первым аргументом Xorg. Вы можете ps затем grep Xorg out.

[[email protected] 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 в любом нужном вам формате.

16
Vitor Py
# 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

]

7
Fordi
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
4
lenroc

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

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

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

0
user177936