Как узнать текущий (активный) номер ДИСПЛЕЯ XServer?

Когда Вы настраиваете использование проводной сети /etc/network/interfaces, Вы говорите Администратору сети не касаться его. Существует некоторая документация этого в статье Debian Wiki NetworkManager.

Так, чтобы заставить его работать, Ваш лучший выбор состоит в том, чтобы, вероятно, удалить (или прокомментировать) Ваша конфигурация в/etc/network/interfaces (за исключением lo), и полностью используйте Администратора сети. Вы, вероятно, захотите сделать их системными соединениями, таким образом, они смогут произойти перед входом в систему.

С другой стороны, Вы могли установить managed=true как показано в Wiki.

4
21.05.2015, 22:38
4 ответа

Похоже, что узел linux настроен как какой-то шлюз RDP. Команда инициирует сеанс SSH ( root @ localhost ), запускает локальный прослушиватель на порте 3300 ( L 3300: ), чтобы переслать весь трафик на машину Windows на порте 3389 ( remote _ WIN _ machine1: 3389 ), типичном для RDP.

Я подозреваю, что директива GatewayPorts имеет набор yes в /etc/ssh/sshd _ config , поэтому прослушиватель принимает и пересылает трафик с удаленных узлов на узел Windows. В этом случае удаленный узел может получить доступ к узлу Windows через этот узел linux, запустив сеанс удаленного рабочего стола как rdesktop -u username linuxhost: 3300

-121--209808-

Насколько мне известно, можно добавить сети с тем же essid. Сделайте это дважды с разными паролями или используйте подключение power lan. Оба должны работать.

-121--197932-

Вы можете попытаться использовать loginctl list-sessions для получения списка сеансов, а затем использовать loginctl show-session -p Display -p Active < идентификатор сеанса > для получения X11 дисплея

Что-то вроде этого (в bash):

TARGET_DISPLAY=()
while read id uid user seat; do
    while IFS='=' read property value; do
        case "$property" in
        Active)
            if [[ "$value" != "yes" ]]; then continue; fi
            ;;
        Display)
            if [[ "$value" ]]; then
                TARGET_DISPLAY+=( "$value" )
            fi
            # else the session isn't graphical
            ;;
        esac
    done < <(loginctl show-session -p Display -p Active "$id")
done < <(loginctl list-sessions --no-legend)

Здесь $ TARGET _ ДИСПЛЕЙ - массив, потому что гипотетически может быть несколько активных сеансов (в многоместной системе). Если это невозможно в конфигурации, можно сделать ее простой переменной и добавить инструкцию break 2 после назначения для выхода из обоих циклов.

ОДНАКО...

... это больше не работает с GDM, потому что в этом случае сервер X запускается внутри сессии (с правами пользователя) и /usr/bin/gdm-x-session не передает эту информацию обратно в logind (из-за отсутствия API для этого).

В других случаях (когда сервер X запускается DM перед созданием сеанса) это, скорее всего, будет работать. Я не знаю о каких-либо других методах, извините.

5
27.01.2020, 20:47

Ну, поскольку в данный момент я имею в виду активный Отображение XOrg сервера. Помните, что у нас может быть запущено несколько XOrg-серверов, и они могут быть мультиголовыми, что усложняет работу.

Другое важное замечание заключается в том, что в некоторых случаях невозможно получить доступ к переменной DISPLAY (например, systemd).

После некоторого обсуждения в commandlinefu, я получил следующий результат:

for p in $(pgrep -t $(cat /sys/class/tty/tty0/active));
do 
    d=$(awk -v RS='\0' -F= '$1=="DISPLAY" {print $2}' /proc/$p/environ 2>/dev/null); 
    [[ -n $d ]] && break; 
done;
echo $d

Этот фрагмент итерации проходит над списком всех процессов (на самом деле их ID), где установлен управляющий терминал и соответствует терминалу этого процесса. Он проверяет окружение каждого процесса на наличие переменной DISPLAY и удовлетворяется, как только находит ее. Найдя переменную DISPLAY, он прекращает итерацию списка и echos результата.

Это выведет на печать активный дисплей, который запустит скрипт.

4
27.01.2020, 20:47

Следующий сценарий перечисляет имя пользователя и номер дисплея для вошедших в систему пользователей, когда соответствующий терминал активен.

w -hs | \
awk -v tty="$(cat /sys/class/tty/tty0/active)" \
    '$2 == tty && $3 != "-" {print $1 FS $3}'

Result:

myuser :0

1
27.01.2020, 20:47

Вот пример с двумя серверами, работающими на одном хосте. Я использовал startxдля запуска их обоих, как вы можете видеть из вывода pstree -plниже. Первый дочерний процесс с набором $DISPLAY.xinitrc:

.
|-login(698)---zsh(1077)---startx(1359)---xinit(1381)-+-.xinitrc(1386)...

Это приказ; если у вас другие настройки, вы можете изменить .xinitrcна что-то другое здесь:

$ pgrep.xinitrc | while read i; do \
    d=$(cat /proc/$i/environ | tr '\0' '\n' | grep DISPLAY); \
    echo -n $d" "; eval $d xprintidle; \
  done | sort -n -k 2
DISPLAY=:1 93
DISPLAY=:0 603301

Цифры показывают время бездействия каждого дисплея в миллисекундах. В верхней строке отображается последний активный (экран с наименьшим бездействием ).

Как бы то ни было, ни один из других ответов мне не помог.

3
27.01.2020, 20:47

Теги

Похожие вопросы