Jak naprawić błąd „nie można otworzyć ekranu” podczas otwierania programu X po ssh'ing z włączonym przekazywaniem X11?

110

Po uruchomieniu aplikacji X11 (XQuartz 2.3.6, xorg-server 1.4.2-apple56) na moim Macu (OS X 10.6.8), otwarciu terminala w X11 i uruchomieniu xhost +, a następnie ssh -Yna mojej maszynie wirtualnej Ubuntu 10.04 (działającej na VMware Połączenie). Kiedy uruchamiam gedit .bashrc(na przykład), otrzymuję:

(gedit:9510): Gtk-WARNING **: cannot open display: 

set | grep DISPLAY nic nie zwraca.

Ale jeśli ssh -Yprzejdę na moją maszynę Ubuntu 11.04, gedit .bashrcdziała. echo $DISPLAYzwraca „localhost: 10.0”.

Próbowałem export DISPLAY=localhost:10.0, wpuszczając się na moją maszynę wirtualną, a następnie działając gedit .bashrc, ale otrzymuję:

(gedit:9625): Gtk-WARNING **: cannot open display: localhost:10.0

Co może się różnić w konfiguracji dwóch różnicowych maszyn Ubuntu, które wyjaśniłyby, dlaczego jedna działa, a druga nie?

Aktualizacja: Jak zasugerował Zoredache w komentarzu poniżej, uruchomiłem sudo apt-get install xbase-clients, ale nadal mam ten sam problem.

Daryl Spitzer
źródło
2
Czy w systemie Ubuntu 10.04 zainstalowane są odpowiednie narzędzia dla X11? Zainstaluj klientów xbase, jeśli nie jest jeszcze zainstalowany.
Zoredache
Zainstalowałem go, ale nadal mam ten sam problem. (Patrz wyżej.)
Daryl Spitzer,
3
Może spróbuj przekazać opcję -vv do ssh podczas łączenia, spowoduje to wyświetlenie pełnych komunikatów debugowania, powinieneś zobaczyć kilka komentarzy na temat przekazywania X11 podczas łączenia.
Zoredache
1
@ jcrawfordor Sprawdziłeś X11Forwardingna Ubuntu One, że xbase-clientszainstalowałeś i możesz uruchomić Xapps na Macu na terminalu, z którego tworzysz połączenie ssh. (Sprawdź, czy $DISPLAYustawiony jest na terminalu uruchomić ssh z .
Manwe
1
W moim przypadku chodziło tylko o aktualizację wersji MacOS
XQuartz

Odpowiedzi:

47

Sprawdź sshd_config serwera (normalnie /etc/ssh/sshd_config) i upewnij się, że opcja X11 Forwarding jest włączona w wierszu

X11Forwarding yes

Jeśli X11 Forwarding nie jest określony, domyślnie nie ma na maszynach Debiana, które mam do sprawdzenia.

DerfK
źródło
4
Po skonfigurowaniu kolejnej maszyny Wirtualnej Ubuntu odkryłem, że muszę zarówno zainstalować klientów xbase, jak i włączyć X11 Forwarding. Zaktualizuj swoją odpowiedź, aby zawierała oba te elementy, a ja ją zaakceptuję.
Daryl Spitzer,
1
Ciekawy. Przynajmniej na nowej instalacji 10.04, którą zrobiłem dziś rano, X11 Przekazywanie było domyślnie włączone. Chłopaki z Ubuntu muszą znowu zadzierać z ustawieniami domyślnymi.
Zoredache,
28
@DerfK, w moim systemie „X11 Forwarding yes” już tam był błąd, ponieważ (gedit: 8381): Gtk-WARNING **: nie można otworzyć wyświetlacza: w takich przypadkach
AJ
1
W Debianie może być konieczne zainstalowanie pakietu xauth, a następnie ponowne zalogowanie.
comte
$ ssh nazwa użytkownika @ nazwa hosta -Y to zadziałało dla mnie
MarcoZen
59

Z xhost +: Jak naprawić błąd „Cannot Open Display” podczas uruchamiania GUI na zdalnym serwerze :

Odpowiedź : Możesz naprawić błąd „nie można otworzyć ekranu”, wykonując procedurę xhost wymienioną w tym artykule.

Pozwól klientom łączyć się z dowolnego hosta za pomocą xhost +

Wykonaj następujące polecenie, aby wyłączyć kontrolę dostępu, dzięki której możesz zezwolić klientom na łączenie się z dowolnego hosta.

$ xhost +

kontrola dostępu wyłączona, klienci mogą łączyć się z dowolnego hosta

Włącz przekazywanie X11

Podczas wykonywania ssh użyj opcji -X, aby włączyć przekazywanie X11.

$ ssh username@hostname -X

Włącz zaufane przekazywanie X11, używając opcji -Y,

$ ssh username@hostname -Y

Otwórz aplikacje GUI na tym hoście

Po otwarciu połączenia ssh ze zdalnym hostem, jak wyjaśniono powyżej, możesz otworzyć dowolną aplikację GUI, która otworzy ją bez żadnych problemów.

Jeśli nadal występuje błąd „nie można otworzyć wyświetlacza”, ustaw zmienną DISPLAY, jak pokazano poniżej.

$ export DISPLAY='IP:0.0'

Uwaga: IP to adres IP lokalnej stacji roboczej, na której ma być wyświetlana aplikacja GUI.

harrymc
źródło
11
+1 za notatkę, że IP = to adres IP lokalnej stacji roboczej, na której chcesz uzyskać GUI
PCoder
3
Jeśli masz podobne problemy w OS X, upewnij się, że masz zainstalowany XQuartz, w przeciwnym razie żadna z tych poprawek nie pomoże. (Pytanie OP pokazuje, że ma XQuartz, więc jest to dodatkowa uwaga dla tych, którzy mają podobne problemy jak ja)
Dolan Antenucci
3
Pamiętaj, że bieganie xhost +jest bardzo niebezpieczne i nie należy go używać! Jak wspomniał Stefan Rogin, atakujący może następnie z hosta połączyć się z Twoją XSession, odczytać wszystko, co piszesz, a nawet zmienić ekran, który widzisz.
jirislav
18

Miałem ten problem również podczas logowania się do maszyny Wirtualnej Ubuntu z systemu Mac OS X - z jakiegoś powodu nie wydaje się, aby „localhost” w zmiennej displayowej. Ustaw adres IP ręcznie, jak sugeruje harrymc:

export DISPLAY="127.0.0.1:10.0"

Wtedy programy X11 powinny być w porządku. Nie wydaje się konieczne, aby informować system operacyjny, że localhost i 127.0.0.1 są równoważne, ale przynajmniej działa.

zakręcić
źródło
To zadziałało dla mnie. Masz pojęcie, dlaczego localhost nie działa?
Alex
2
BINGO! Utknąłem z tym problemem przez jakiś czas ... Połączyłem się przez SSH i nie mogłem uruchomić programów Gtk (zwykły X11, jak „xeyes”, działał jednak). WYŚWIETLACZ był poprawny. W rzeczywistości rozdzielczość „localhost” nie była! Jeśli ustawię ręcznie DISPLAY = 127.0.0.1: 10.0 lub DISPLAY = :: 1: 10.0 to działa. Edycja / etc / hosts wydaje się nie mieć żadnego wpływu; a DNS jest poprawnie skonfigurowany (korelacja „dig localhost” zgłasza zarówno 127.0.0.1, jak i :: 1). Wydaje się, że to błąd w jakiejkolwiek rozdzielczości DNS dla połączeń X11 w Gtk (gtk? gdk? glib? other?).
Pablo Saratxaga
1
W instalacji Debiana dla Beagle Bone Black, / etc / host nie był ustawiony na czytelny dla nikogo poza rootem. Spowodowało to zgłoszone tutaj objawy. Sprawiło, że / etc / hosts były czytelne dla wszystkich i działało dobrze.
Daniel
13

Miałem ten problem z moim serwerem KVM CentOS, brakowało mi programu „xauth”.

Joril
źródło
1
Pomogło mi to w minimalnej instalacji Debiana, dziękuję bardzo!
binOr
9

Jeśli masz ten problem po pewnym czasie pracy z -Xarg. lub po prostu ForwardX11w / etc / ssh / ssh_config, a następnie uruchom $ ssh username@hostname -Y, aby włączyć zaufane przekazywanie X11 , nie znam dokładnej przyczyny, ale domyślam się, że -Xniektóre funkcje wygasają po pewnym czasie, prawdopodobnie w celu zwiększenia bezpieczeństwa.

Oto, co znalazłem w Internecie:

Jeśli używasz ssh -X remotemachine, maszyna zdalna jest traktowana jako niezaufany klient. Zatem lokalny klient wysyła polecenie do zdalnego komputera i odbiera dane wyjściowe w postaci graficznej. Jeśli Twoje polecenie narusza niektóre ustawienia zabezpieczeń, zamiast tego pojawi się błąd.

Ale jeśli używasz ssh -Y remotemachine, maszyna zdalna jest traktowana jako zaufany klient. Ta ostatnia opcja może powodować problemy z bezpieczeństwem. Ponieważ inny klient graficzny (X11) może wąchać dane ze zdalnego komputera (robić zrzuty ekranu, rejestrować hasła i inne nieprzyjemne rzeczy), a nawet można je zmieniać.

Jeśli chcesz dowiedzieć się więcej na ten temat, sugeruję przeczytanie strony podręcznika Xsecurity lub specyfikacji rozszerzenia X Security. Ponadto możesz sprawdzić opcje ForwardX11 i ForwardX11Trusted w swoim / etc / ssh / ssh_config.

źródła:

Stefan Rogin
źródło
6

Właśnie przetestowane na moim Macu, inne systemy mogą być OK :

  1. Pozwól klientom łączyć się z dowolnego hosta za pomocą xhost +

    $ xhost +

  2. Powinieneś mieć środowisko obsługujące wyświetlanie X11

    [System Mac] Zainstaluj X11 dla systemu Mac https://www.xquartz.org/

  3. Powinieneś pozwolić serwerowi ssh na przekazanie x11 do przodu

    zaktualizuj /etc/ssh/sshd_configi ustaw X11Forwarding yes, a następnie uruchom ponownie serwer ssh

  4. Powinieneś pozwolić, aby twoja sesja ssh przekazała x11 do przodu z -Xparametrem

    $ ssh -X użytkownik @ ip

  5. Jak otworzyć aplikację X11 w PyCharm?
    • otwórz sesję ssh, która obsługuje wyświetlanie X11 (pamiętaj, aby zachować tę sesję)
    • uruchom echo $DISPLAYw tej sesji ssh
    • ustaw DISPLAYzmienną środowiskową dla swojego PyCharm
Kolor
źródło
1
Dlaczego to się różni lub dlaczego należy ją preferować nad jakąkolwiek inną odpowiedzią? Wyjaśnij, czy możesz to zrobić za pomocą prostej edycji . Możesz to zrobić!!
Pimp Juice IT
@ Dzięki McDonald's, zaktualizowane o więcej szczegółów.
Kolor
4

Podczas uruchamiania UXTERM lub XTERM po prostu problem

export $DISPLAY 

Zmienna będzie tam. Następnie wystarczy go ustawić i wyeksportować.

Oracle2066
źródło
4

Musiałem wprowadzić /etc/ssh/sshd_confignastępujące informacje:

X11UseLocalhost no

Zamiast tego ustaw na „tak”. Dziwne, jeśli wartością domyślną jest „NIE” Użytkownicy używający szpachli z XMing pod Windows. Używam prostego ssh nad Fedorą. Czasami zaczynał nam dawać

error can't open display localhost

Ponowne uruchomienie serwera zwykle to naprawia, ale jest to głupie. Wykonano powyższe czynności, ponownie uruchomiono usługę sshdna serwerze i ponownie poprawnie działały nowe połączenia.

Luigi
źródło
2

Miałem również ten problem z Solaris 10 i stwierdziłem, że detektor nie został skonfigurowany.

svccfg –s /application/x11/x11-server listprop options/tcp_listen
svccfg –s /application/x11/x11-server setprop  options/tcp_listen = true
Doug Somers
źródło
1

W CentOS 6.5 nagle straciłem dostęp do zdalnych programów X po zadziałaniu z / etc / hosts. Ten sam objaw pustej zmiennej $ DISPLAY (brak pomocy w ustawianiu / eksportowaniu jej ręcznie).

Konieczny jest wpis 127.0.0.1 wskazujący rzeczywistą nazwę hosta; w rzeczywistości kolejność wydaje się również mieć znaczenie (wstaw na końcu i nie będzie działać ...)

[root@poseidon /etc]$ cat hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1       localhost.localdomain localhost
::1     localhost6.localdomain6 localhost6
127.0.0.1 poseidon.mycampus.edu poseidon
1XX.XXX.XXX.208 poseidon.mycampus.edu poseidon

Po naprawieniu tego xeyes, xclock i inne zabawki testowe X znów działają, dlatego mój potrzebny virt-manager również powrócił do pracy.

David Ramirez
źródło
1

Właśnie znalazłem fajną czkawkę w mojej konfiguracji, która uniemożliwiła przekazywanie x: Mój firewall blokował wszystkie połączenia z localhost, uniemożliwiając w ten sposób dostęp do tunelu

Pelle
źródło
1

Jeśli używasz Konsoli, po prostu przełącz się na inny emulator terminala, taki jak Terminal Xfce i spróbuj ponownie, używając roota.

Oliver
źródło
1

otwórz terminal $ ssh nazwa użytkownika @ nazwa hosta -X

$ ssh username@hostname -Y

$ export DISPLAY='IP:0.0'

eksport DISPLAY = „127.0.0.1:10.0” wszystko powinno działać.

Kenny Gichuhi
źródło
Dzięki. Działa w moim specjalnym przypadku, gdy DISPLAY='localhost:10.0'nie działa.
xpt
1

Ta konfiguracja działa dla mnie:

Lokalny (64-bitowy Cygwin w systemie Windows 10) DISPLAY=:0

Serwer (Amazon EC2 RHEL 7.6) DISPLAY=:10.0

Ustawienia te znaleziono, klikając „X menu aplikacji na: 0” na pasku zadań i wybierając Narzędzia systemowe> Terminal

qwr
źródło
0

Po wielu frustracjach dowiedziałem się, że wpis nazwy hosta serwera w jego pliku / etc / host jest niepoprawny.

iceburn_pt
źródło