X11 Przekazywanie przez ekran Gnu, czy to możliwe?


32

Ciągle używam GNU Screen. Ale próbowałem dowiedzieć się, czy jest jakiś sposób, aby aplikacje X11 przesuwały się po ekranie, gdy przesyłam ssh (czy to słowo?). Obecnie, jeśli spróbuję uruchomić „gedit” na ekranie, otwiera się on na moim komputerze „serwerowym”, a nie na moim kliencie. Jeśli zrobię to samo poza ekranem, wszystko będzie w porządku. Ale chcę, aby wszystko było w porządku, gdy używam ekranu!

Dzięki!

PS: Przejrzałem problem i widzę wzmiankę o xmove, ale nie mogę znaleźć pakietu zawierającego xmove na moim Ubuntu. (ubuntu 10.10)


Nie mam teraz czasu na znalezienie pełnej odpowiedzi, ale potrzebujesz kilku zmiennych środowiskowych, aby poprawnie ustawić. Prawdopodobnie możesz dowiedzieć się, które z nich patrząc na twoje środowisko poza ekranem.
JanC

Odpowiedzi:


32

Aby to zrobić ręcznie, po włączeniu SSHed, ale przed ponownym podłączeniem do ekranu, sprawdź zmienną środowiskową DISPLAY:

echo $DISPLAY

Po ponownym podłączeniu do ekranu wyraźnie ustaw zmienną środowiskową:

export DISPLAY=:N.0

gdzie : N.0 jest tym, co echopokazano przed załączeniem. Nie będzie to idealne, ponieważ niektóre aplikacje mogą oczekiwać rozmowy z S-Bus D-Bus, która jest nieco bardziej skomplikowana do wysłania przez połączenie SSH.


1
Niesamowite! Wydaje się, że działa to w przypadku większości aplikacji. Próbuję zwiększyć ekran „fu”. Czy masz jakieś pomysły lub możesz przynajmniej wskazać mi ogólny kierunek, w jaki sposób mogę to zautomatyzować? Dziękuję Ci!
Sandro

Zrobiłem dziwne rzeczy, takie jak pisanie skryptów, na przykład: echo $DISPLAY > $HOME/.display.txt; screen -x -da potem kolejny na ekranie, który działaexport DISPLAY=$(cat $HOME/.display.txt)
Kees Cook

dokładnie to starałem się osiągnąć. Ale jak dotąd nie ma szczęścia. Próba uruchomienia eksportu jest dość trudna, ponieważ uruchomienie go w skrypcie nie jest dobre, muszę jakoś go zdobyć ... a setenv również nie wydaje się mieć magicznego charakteru.
Sandro,

Aby podać źródło skryptu, . /path/to/scriptgdzie scriptjestexport DISPLAY=$(cat $HOME/.display.txt)
Kees Cook

Zakłada się, że nie masz automatycznego uruchamiania ekranu przy logowaniu (a la byobu)
Student at a University

11

w repozytoriach jest program o nazwie xpra, to jest jak ekran GNU dla X11. nie jest zbyt ciężko pracować z:

X Trwałe aplikacje zdalne

Xpra zapewnia funkcjonalność GNU Screen dla aplikacji X.

Pozwala użytkownikowi przeglądać zdalne aplikacje X na swoim komputerze lokalnym oraz rozłączać i ponownie łączyć się z komputerem zdalnym bez utraty stanu uruchomionych aplikacji.


2
Napisałem o tym, jak właściwie zintegrować xpra z Screen, aby osiągnąć trwałość aplikacji konsoli i X11: krlmlr.github.io/integrating-xpra-with-screen . Pracuje dla mnie.
krlmlr

7

Byobu automatycznie ponownie łączy agentów ssh i gpg. Mógłbym sprawić, by ponownie przymocował zmienną display, jeśli jest to pomocne ...


Wydaje się, że nawet nie przekazuje zmiennej ekranowej w NOWYCH sesjach utworzonych w sesji ssh z przekazywaniem X11. Byłoby wspaniale, gdyby tak się stało ... Przestałem go używać z powodu bólu związanego z koniecznością wyłączenia automatycznego uruchamiania byobu, aby można było korzystać z przekazywania X11.
Student on University

2

Tak to działało, kiedy uruchomiłem byobu

Dodaj ten wiersz w .bash_login przed wierszem „_byobu_source ..”:

echo $DISPLAY > $HOME/.display.env

A następnie dodaj ten wiersz do .bashrc :

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

1

Wygląda na to, że problem polega na tym, że zmienna środowiskowa XAUTHORITY nie jest zachowywana w sesji ekranowej. Rozwiązałem ten problem, dodając następujące elementy do mojego .bashrc. Nie sądziłem, że powinno to być konieczne, ale myślę, że robisz to, co musisz:

# 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

Nie oczekuję, że będzie to najlepsze lub najbardziej zwięzłe rozwiązanie, ale działa.



0

Na podstawie sugestii @harre uznałem, że jest to najlepsze działające rozwiązanie, przynajmniej dla RHEL za pośrednictwem Putty. Wiem, że istnieje lepszy sposób niż utworzenie pliku zawierającego var, ale działa to poza bramą, aby uzyskać X11dostęp do pliku DISPLAYpo załadowaniu przez gnu screen.

Zautomatyzowane rozwiązanie

Dodaj do .bashrc(lub .bash_profile, w zależności od przypadku użycia)

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

Następnie dodaj następujący plik (lub swój wybór ścieżki)

#~/etc/.bash-screen-x11
# sets back display var.
if [ -z $STY ]; then
  export DISPLAY=$(cat $HOME/.display.env)
fi
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.