Ошибка `не указан протокол` при запуске с удаленного компьютера через ssh


10

У меня есть скрипт, просто для запуска моего графического (GUI) приложения, как показано ниже.

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

Когда я запускаю его с локальной машины ( ./gui.sh), он работает отлично. Но когда я пытаюсь запустить его с удаленного компьютера через SSH, я получил следующую ошибку.

[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]#    

Я не знаю, какой протокол он запрашивает или я что-то упускаю? Я попробовал напрямую, запустив приложение, без скрипта [ ssh -f 192.168.3.77 "cd /root/Desktop/GUI/ && "./gui""], но результат тот же. Я пробовал различные комбинации, как ssh -Y, ssh -fYи многое другое, но результат тот же!
Во-вторых, для моего приложения есть обязательное условие, что мы должны сначала перейти в каталог, где находится программа.
Любые решения?

Ответы:


5

Значение параметра -display 127.0.0.1:0.0зависит от этой guiпрограммы, но весьма вероятно, что оно означает «отображение на дисплее X 127.0.0.1:0.0». Это первый локальный X-дисплей, доступ к которому осуществляется через TCP. Это почти наверняка неправильно по двум причинам. Во-первых, локальный X-дисплей должен быть :0, а не 127.0.0.1:0потому, что включение IP-адреса заставляет трафик проходить через TCP вместо локального доступа. Прохождение через TCP может не работать в зависимости от того, принимает ли X-сервер TCP-соединения. Даже если это произойдет, вы потеряете оптимизацию, которую имеют локальные дисплеи.

Используемый дисплей обычно указывается DISPLAYпеременной среды, и эта переменная обычно устанавливается правильно. (Обычно, если DISPLAYимеет неправильное значение, это потому, что вы возились с ним. Основным исключением является использование screenили tmux.)

Ваша программа, вероятно, ищет значение DISPLAYпеременной окружения, потому что это происходит автоматически при вызовах xlib. Так что вам нужно просто позвонить ./gui, ваш скрипт не делает ничего полезного. Если ваша программа настаивает на -displayаргументе, используйте переменную окружения:

./gui -display "$DISPLAY"

4

ssh -Yи ssh -Xдолжно быть хорошее начало, но вы также перешли на свой X-сервер?

$ grep X /etc/ssh/sshd_config
X11Forwarding yes

иначе это не сработает.

Еще одна вещь, которую нужно проверить - переменная DISPLAY, она должна показывать что-то вроде этого:

$ echo $DISPLAY
$ localhost:10.0

это было запущено после ssh -Y. Эта же переменная пуста, если я ssh без -Yили -X.

О различиях -Xи -Yпрочитайте справочную страницу ssh.


3

Это видео объясняет, как решить проблему шаг за шагом. Если вы не хотите смотреть, следуйте тексту ниже:

Ошибка «Не указан протокол» означает, что «пользователь не знает, как запустить приложение с графическим интерфейсом», а «у пользователя нет прав на запуск приложения с графическим интерфейсом». В видео приложение GUI есть dbca.

Ключевой частью этого видео является выполнение команды, xhost +которая предоставляет пользователю разрешения на удаленное отображение графического интерфейса пользователя из удаленной системы в локальной системе.


6
xhost +предоставит доступ любому, кто подключится к вашему дисплею. Я бы порекомендовалxhost +local:[hostname or ip]
vimdude

Это и это то, что исправило ошибку для меня. +1
Юг Сингх

1

Debian Jessie, добавь также:

export XAUTHORITY=/.Xauthority

xhost +исправил мою проблему (на стороне клиента)
danger89

Это помогло, спасибо! Мой XAUTHORITY был, /tmp/xauth-1000-_0но после запуска двух дополнительных сеансов X этот файл исчез - остался только третий. Чтобы исправить проблему для всех окон, я восстановил это с помощью:ln -s ~/.Xauthority /tmp/xauth-1000-_0
joeytwiddle

0

Я столкнулся с той же проблемой, которую решил, изменив переменную окружения DISPLAY:

export DISPLAY=:0.0

в

export DISPLAY=:10
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.