Błąd `Nie określono protokołu` podczas uruchamiania ze zdalnego komputera przez ssh

10

Mam skrypt, aby po prostu uruchomić moją aplikację graficzną (GUI), jak poniżej.

#cat gui.sh
#!/bin/bash 
./gui -display 127.0.0.1:0.0    

Kiedy uruchamiam go z lokalnej maszyny ( ./gui.sh), działa idealnie dobrze. Ale kiedy próbuję uruchomić go ze zdalnego komputera przez ssh, pojawia się błąd.

[root@localhost]# ssh -f 192.168.3.77 "cd /root/Desktop/GUI/ && "./gui.sh""   
No protocol specified  
gdm: cannot connect to X server 192.168.3.77:0.0   
[root@localhost]#    

Nie wiem, o który protokół pyta, czy coś mi brakuje? Próbowałem bezpośrednio, uruchamiając aplikację bez skryptu [ ssh -f 192.168.3.77 "cd /root/Desktop/GUI/ && "./gui""], ale wynik jest taki sam. Próbowałem różnych kombinacji, jak ssh -Y, ssh -fYi więcej, ale wynik jest taki sam!
Po drugie, w przypadku mojej aplikacji konieczny jest warunek, że musimy najpierw przejść do katalogu, w którym znajduje się program.
Jakieś rozwiązania?

TPS
źródło

Odpowiedzi:

5

Znaczenie opcji -display 127.0.0.1:0.0zależy od tego guiprogramu, ale jest wysoce prawdopodobne, że oznacza ona „wyświetlanie na wyświetlaczu X 127.0.0.1:0.0”. Jest to pierwszy lokalny wyświetlacz X, dostępny przez TCP. Jest to prawie na pewno złe z dwóch powodów. Po pierwsze, lokalny wyświetlacz X powinien być :0, 127.0.0.1:0ponieważ nie , ponieważ podanie adresu IP powoduje, że ruch przechodzi przez TCP zamiast lokalnego dostępu. Przejście przez TCP może nie działać w zależności od tego, czy serwer X akceptuje połączenia TCP. Nawet jeśli tak, tracisz optymalizacje, które mają lokalne wyświetlacze.

Wyświetlany ekran jest zwykle wskazywany przez DISPLAYzmienną środowiskową, a zmienna ta zwykle jest ustawiana poprawnie automatycznie. (Zwykle, jeśli DISPLAYma złą wartość, to dlatego, że się z tym bałaganiłeś. Głównym wyjątkiem jest użycie screenlub tmux.)

Twój program prawdopodobnie szuka wartości DISPLAYzmiennej środowiskowej, ponieważ zwykle dzieje się tak automatycznie w przypadku wywołań xlib. Więc powinieneś po prostu zadzwonić ./gui, twój skrypt nic nie robi. Jeśli Twój program nalega na -displayargument, użyj zmiennej środowiskowej:

./gui -display "$DISPLAY"
Gilles „SO- przestań być zły”
źródło
4

ssh -Yi ssh -Xpowinien być dobry początek, ale czy przesłałeś również swój serwer X?

$ grep X /etc/ssh/sshd_config
X11Forwarding yes

inaczej to nie zadziała.

Kolejną rzeczą do sprawdzenia jest zmienna DISPLAY, która powinna pokazywać coś takiego:

$ echo $DISPLAY
$ localhost:10.0

to było później ssh -Y. Ta sama zmienna jest pusta, jeśli ssh bez -Ylub -X.

Różnice między -Xi -Yprzeczytaj stronę podręcznika ssh.

hashier
źródło
3

W tym filmie wyjaśniono krok po kroku sposób rozwiązania problemu. Jeśli nie chcesz oglądać, postępuj zgodnie z poniższym tekstem:

Błąd Nie określono protokołu wskazuje, że „użytkownik nie wie, jak uruchomić aplikację GUI”, a „użytkownik nie ma uprawnień do uruchomienia aplikacji GUI”. Na filmie jest aplikacja GUI dbca.

Kluczowym elementem tego wideo jest uruchomienie polecenia, xhost +które przyznaje użytkownikowi uprawnienia do zdalnego wyświetlania GUI ze zdalnego systemu do systemu lokalnego.

Vishwanath gowda k
źródło
6
xhost +da dostęp każdemu, kto może połączyć się z twoim wyświetlaczem. Polecamxhost +local:[hostname or ip]
vimdude
To i to naprawiło błąd. +1
Yug Singh
1

Debian Jessie, dodaj także:

export XAUTHORITY=/.Xauthority
ranzi
źródło
xhost +naprawiono mój problem (po stronie klienta)
niebezpieczeństwo89
To pomogło, dziękuję! Mój XAUTHORITY był, /tmp/xauth-1000-_0ale po rozpoczęciu dwóch dodatkowych sesji X plik zniknął - pozostała tylko trzecia. Aby naprawić problem dla wszystkich okien, przywróciłem go za pomocą:ln -s ~/.Xauthority /tmp/xauth-1000-_0
joeytwiddle
0

Trafił mnie ten sam problem, który rozwiązałem, zmieniając zmienną środowiskową DISPLAY z:

export DISPLAY=:0.0

do

export DISPLAY=:10
Faheem
źródło