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

32

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

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

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

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

Ответы:

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-приложения на своем локальном компьютере, а также отключать и повторно подключаться к удаленному компьютеру без потери состояния запущенных приложений.

Avihay
источник
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
Harre
источник
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

FreeNX - замечательное приложение для работы с удаленными дисплеями.

обычный
источник
4
Не могли бы вы объяснить дальше?
Студент в университете
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
Брайан Томас
источник