X11 Переадресація через Gnu Screen, це можливо?


32

Я постійно використовую екран GNU. Але я намагався з’ясувати, чи є якийсь спосіб, щоб додатки X11 пересилалися по екрану, коли я працюю на екрані (це слово?). В даний час, якщо я спробую запустити 'gedit' через екран, він відкриється на моєму «серверному» комп'ютері, а не на моєму клієнті. Якщо я роблю те ж саме поза екраном, то все добре. Але я хочу, щоб все було добре, коли я також використовую екран!

Спасибі!

PS: Я вирішив проблему в Google, і я бачу згадку про xmove, але я не можу знайти пакет, який містить xmove в моєму ubuntu. (ubuntu 10.10)


Зараз у мене немає часу знайти повну відповідь, але для правильного встановлення потрібні деякі змінні середовища. Ви, напевно, можете дізнатись, хто з них дивиться на зовнішнє середовище поза екраном.
JanC

Відповіді:


32

Щоб зробити це вручну, як тільки ви ввімкнули SSHed, але перед повторним приєднанням до екрана, перевірте змінну середовища DISPLAY:

echo $DISPLAY

Після повторного приєднання до екрана явно встановіть змінну середовища:

export DISPLAY=:N.0

де : N.0 - це те, що echoпоказано перед вкладенням. Це не буде ідеально, оскільки деякі програми, можливо, розраховують поговорити з сеансом 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 screen для x11. працювати не дуже складно:

X Постійні віддалені програми

Xpra надає функціональність екрану GNU для додатків X.

Це дозволяє користувачеві переглядати віддалені програми X на своїй локальній машині, а також відключати та підключатись до віддаленої машини, не втрачаючи стан запущених програм.


2
Я писав про те, як насправді інтегрувати xpra з Screen, щоб досягти як консолі, так і стійкості програми X11: krlmlr.github.io/integrating-xpra-with-screen . Працює для мене.
krlmlr

7

Byobu автоматично приєднує агенти ssh та gpg. Я можу змусити його повторно встановити змінну дисплея, якщо це вам корисно ...


Здається, він навіть не проходить уздовж відображуваної змінної в НОВИХ сесіях, створених в сеансі ssh з переадресацією X11. Було б чудово, якби це було ... Я припинив його використовувати через головний біль, коли потрібно було відключити автоматичний запуск bybubu, щоб можна було використовувати переадресацію 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.