X11 Переадресация через экран Gnu, это возможно?


32

Я использую GNU Screen постоянно. Но я пытался выяснить, есть ли какой-нибудь способ заставить приложения X11 пересылать по экрану, когда я пишу по ssh (это слово?). В настоящее время, если я пытаюсь запустить «gedit» через экран, он открывается на моем «серверном» компьютере, а не на моем клиенте. Если я делаю то же самое за пределами экрана, то все в порядке. Но я хочу, чтобы все было хорошо, когда я использую экран тоже!

Благодарность!

PS: я погуглил проблему и вижу упоминание о xmove, но я не могу найти пакет, содержащий xmove, в моей Ubuntu. (Ubuntu 10.10)


У меня нет времени, чтобы найти полный ответ сейчас, но вам нужно, чтобы некоторые переменные окружения были установлены правильно. Вы можете, вероятно, узнать, какие из них, глядя на вас за пределами экрана.
Янв

Ответы:


32

Чтобы сделать это вручную, после подключения по SSH, но перед повторным подключением к экрану проверьте переменную среды DISPLAY:

echo $DISPLAY

После повторного присоединения к экрану явно установите переменную среды:

export DISPLAY=:N.0

где : N.0 - это то, что было echoпоказано перед прикреплением. Это не будет идеально, так как некоторые приложения могут ожидать соединения с Session D-Bus, который немного сложнее отправить по соединению SSH.


1
Потрясающе! Кажется, это работает для большинства приложений. Я пытаюсь поднять экран "фу". У вас есть какие-нибудь идеи или вы можете указать мне общее направление, как я могу автоматизировать это? Спасибо!
Сандро

Я сделал странные вещи, такие как сценарии, например: echo $DISPLAY > $HOME/.display.txt; screen -x -dа затем еще один на экране для запуска, который делаетexport DISPLAY=$(cat $HOME/.display.txt)
Kees Cook

это именно то, что я пытался сделать. Но пока не повезло. Попытка добиться того, чтобы этот экспорт выполнялся, является довольно серьезным препятствием, поскольку запуск его в скрипте бесполезен, мне нужно каким-то образом его получить ... и, похоже, у setenv тоже нет волшебства.
Сандро

Для исходных текстов типа . /path/to/scriptгде scriptнаходитсяexport DISPLAY=$(cat $HOME/.display.txt)
Kees Cook

Это предполагает, что у вас нет автозапуска экрана при входе в систему (a la byobu)
Студент в университете

11

в репозиториях есть программа под названием xpra, это как экран gnu для x11. это не так сложно работать с:

X Постоянные удаленные приложения

Xpra предоставляет вам функциональность GNU Screen для приложений X.

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


2
Я написал о том, как на самом деле интегрировать xpra с Screen для обеспечения устойчивости консольного и X11-приложений: krlmlr.github.io/integrating-xpra-with-screen . Работает для меня.
krlmlr

7

Byobu автоматически присоединяет агенты ssh и gpg. Я мог бы сделать так, чтобы он снова подключил экранную переменную к, если это полезно для вас ...


Кажется, он даже не передает переменную отображения в новых сеансах, созданных в сеансе ssh с пересылкой X11. Было бы замечательно, если бы это произошло ... Я перестал его использовать из-за головной боли из-за необходимости отключить автозапуск byobu, чтобы можно было использовать пересылку X11.
Студент в университете

2

Вот так у меня получилось работать при запуске byobu

Добавьте эту строку в .bash_login перед строкой "_byobu_source ..":

echo $DISPLAY > $HOME/.display.env

А затем добавьте эту строку в .bashrc :

if [ ! -z ${SSH_CONNECTION+x} ]; then
  export DISPLAY=$(cat $HOME/.display.env) 
fi

1

Кажется, проблема в том, что переменная окружения XAUTHORITY не сохраняется в сеансе экрана. Я решил это, добавив следующее в мой .bashrc. Я не думаю, что это должно быть необходимым, но я думаю, что вы делаете то, что должны:

# ensure X forwarding is setup correctly, even for screen
XAUTH=~/.Xauthority
if [[ ! -e "${XAUTH}" ]]; then
 # create new ~/.Xauthority file
 xauth
fi
if [[ -z "${XAUTHORITY}" ]]; then
 # export env var if not already available.
 export XAUTHORITY="${XAUTH}" 
fi

Я не ожидаю, что это будет лучшим решением или кратким, но оно работает.



0

Основываясь на предложении @harre, я обнаружил, что это лучшее рабочее решение, по крайней мере для RHEL через Putty. Я знаю, что есть лучший способ, чем создать файл, содержащий var, но он работает вне шлюза, чтобы получить X11доступ к DISPLAYпри загрузке через gnu screen.

Автоматизированное решение

Добавить в .bashrc(или .bash_profile, в зависимости от вашего варианта использования)

#.bashrc
if [ -f ~/etc/.bash-screen-x11 ]; then
   echo $DISPLAY > $HOME/.display.env
   source ~/etc/.bash-screen-x11
fi

Затем добавьте следующий файл (или ваш выбор пути)

#~/etc/.bash-screen-x11
# sets back display var.
if [ -z $STY ]; then
  export DISPLAY=$(cat $HOME/.display.env)
fi
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.