Вопрос или проблема
Я подключаюсь с Windows PC к Linux PC через ssh, используя MobaXTerm.
В ssh-сессии у меня есть tmux-сессия с несколькими окнами и панелями.
Сессия ssh обычно разрывается после нескольких часов бездействия (я пытался изменить, казалось бы, соответствующие настройки keep-alive в MobaXTerm, но это никогда не работало).
Проблема первого мира: после начала новой ssh-сессии и повторного подключения к уже существующим tmux-сессиям переменная $DISPLAY иногда устанавливается “неправильно” — имею в виду, когда я запускаю GUI, который использует X-Windows (например, Firefox), я получаю сообщения об ошибке “невозможно открыть дисплей”. Например:
$ firefox &[1] 23077$ Unable to init server: Broadway display type not supported: localhost:11.0Error: cannot open display: localhost:11.0[1]+ Exit 1 firefox$ echo $DISPLAYlocalhost:11.0
Обычно, когда я открываю новый терминал, я получаю обновлённое/правильное значение $DISPLAY — из этого терминала я смогу успешно запускать GUI, использующие X-Windows.
Вопрос: существует ли какой-либо способ динамически “обновить” значение $DISPLAY в существующем терминале (то есть в терминале, который был активен с момента разрыва ssh)? То есть мне бы хотелось избежать запуска нового терминала только с целью получения/выявления нового значения $DISPLAY.
Я не очень хорошо понимаю, что именно представляет собой $DISPLAY, так что буду благодарен, если кто-то объяснит, что он представляет и делает в описанном контексте.
После подключения tmux по умолчанию обновит DISPLAY в среде сессии, но применить это может только к новым панелям. Чтобы применить это к существующей панели, вы можете сделать что-то вроде:
eval «$(tmux showenv -s DISPLAY)»
DISPLAY используется клиентами X (программами приложений) для нахождения соответствующего X-сервера, к которому нужно подключиться. Он имеет форму hostname:displaynr.screennr, но обычно вы видите что-то вроде :0, что означает первый дисплей X-сервера, запущенного на localhost.
Использование имени хоста там не безопасно, потому что протокол X не зашифрован. Поэтому ssh с X-перенаправлением использует эту схему, находя свободный номер дисплея, обычно 10 или больше, и притворяясь X-сервером с этим номером дисплея. Но на самом деле он просто перенаправляет протокол X через соединение ssh на X-сервер, работающий на хосте, где был вызван ssh-клиент.
Поэтому вы получаете разное содержание DISPLAY, когда переподключаетесь через ssh — каждое подключение через ssh устанавливает эту переменную, возможно, в другое значение.
Это новое правильное значение видно до подключения к tmux. Оно также видно, когда вы открываете новый терминал, потому что новый терминал скопирует свежесозданное значение переменной DISPLAY, в то время как старый терминал будет хранить переменную DISPLAY, которая у него уже была.
Таким образом, если вместо подключения к tmux вы запустите собственный скрипт, который прочитает DISPLAY, подключится к tmux и затем установит DISPLAY в существующих сессиях, вы можете автоматизировать то, что вам нужно сделать.
Однако делать это с tmux не представляется простым. Здесь есть еще один вопрос с несколькими предложениями, как это сделать, которые могут подойти вам (или нет).
Когда вы входите в сеть, используйте -X; (например, ssh -X [email protected]).
Параметр -X позволяет ssh отображать ваш браузер.
Вопрос: существует ли какой-либо способ динамически “обновить” значение $DISPLAY в существующем терминале (то есть в терминале, который был активен с момента разрыва ssh)? То есть мне бы хотелось избежать запуска нового терминала только с целью получения/выявления нового значения $DISPLAY.
По моему опыту, самый простой способ сделать это — отсоединиться от tmux в GUI-сессии, а затем повторно подключиться.
Ответ или решение
Вопрос, поставленный в вашей ситуации, связан с правильной настройкой переменной окружения $DISPLAY при работе с подключением по SSH с использованием MobaXTerm на компьютере Windows к Linux-серверу. Проблема проявляется в том, что при разрыве SSH-сессии и последующем переподключении значение переменной $DISPLAY в существующих сеансах может быть некорректным, что приводит к невозможности запуска X-Window приложений. Давайте разберемся более подробно, что такое $DISPLAY, как она работает и какие шаги можно предпринять для ее корректной настройки в вашей ситуации.
Теория
Переменная $DISPLAY используется в графической системе X Window для определения X-сервера, к которому X-клиент (например, приложение Firefox) должен подключиться. Она имеет формат hostname:display_number.screen_number, где hostname — это имя хоста, на котором работает X-сервер, display_number обозначает номер дисплея, а screen_number — номер экрана. В локальных системах часто используется упрощенная форма :0, что обозначает первый дисплей локального X-сервера.
Когда вы используете SSH с перенаправлением X (флаг -X), SSH создает передачу X-протокола через зашифрованное соединение. В этом случае $DISPLAY будет указывать на псевдодисплей, например localhost:10.0, который фактически передает данные через SSH на ваш локальный X-сервер. Каждое подключение SSH может устанавливать своё значение $DISPLAY, поэтому при переподключении значение этой переменной может изменяться.
Пример
Представьте, что вы открыли новое SSH-подключение и запустили команду echo $DISPLAY. Вы увидите новое значение, например localhost:10.0, назначенное в этом сеансе SSH. Когда вы откроете новый терминал или создаете новый сеанс, это значение будет установлено по умолчанию. Однако, если вы продолжите использовать старые терминалы или окна tmux, открытые до разрыва соединения, они могут сохранять старое значение переменной $DISPLAY, что приводит к ошибкам при попытке запуска X-приложений.
Применение
Ключевая задача — обновить значение $DISPLAY в существующих сеансах или окнах. Существует несколько подходов, которые помогут вам в этом:
- Использование команды tmux: Вы можете использовать команду eval «$(tmux showenv -s DISPLAY)», чтобы обновить значение $DISPLAY в открытом окне tmux. Эта команда извлекает текущее значение $DISPLAY, установленное через SSH, и применяет его к текущему окну tmux.
- Перезагрузка терминала: Это решение является наиболее прямолинейным — закрытие и повторное открытие терминала с новым SSH-подключением автоматически обновит значение $DISPLAY.
- Скрипт автоматизации: Вы можете создать скрипт, который автоматизирует процесс: он сначала извлекает актуальное значение $DISPLAY, затем подключается к tmux и обновляет значение во всех существующих окнах.
- Переподключение tmux: Хотя это и занимает чуть больше времени, вы можете отсоединить и снова подключить ваш текущий сеанс tmux. Это гарантирует, что новое значение $DISPLAY будет применено ко всем вновь созданным окнам сессии.
Заключение
Переменная $DISPLAY — это важный элемент для работы X-приложений в окружениях с перенаправлением X через SSH. Корректная настройка этой переменной окружения особенно актуальна в сценариях, когда используются инструменты управления сеансами, такие как tmux. Понимание принципов работы $DISPLAY, а также методов его автоматического обновления в сценариях неустойчивого сетевого соединения позволит вам эффективно управлять рабочими сеансами и избегать потери важной информации. Эти практики помогут вам поддерживать непрерывную и продуктивную работу в системах с X-сервером.