
У меня есть локальная машина (A) и Raspberry PI 3 (B).
К B подключен монитор HDMI, и на нем установлена ОС Raspbian.
Я хочу запустить приложение X на компьютере A, например, презентацию Libre Office Impress, которая у меня есть на компьютере A, и сделать ее видимой (отображаемой) на экране, подключенном к компьютеру B.
Я хочу сделать это перед компьютером A:
- не
ssh -X to_A
от B, - ни использование VNC из B для получения вывода из A
Я не ищу:
- Запуск приложения X на B с использованием ssh из A и отображение его вывода на A (это можно сделать либо с помощью
from_a $ ssh -X machine_B
клиентов rdp/remmina/vnc) - Запуск приложения X на B с использованием ssh из A и отображение его вывода на B (это можно сделать, например, экспортировав отображение в ssh и правильно настроив xhost
from_a $ ssh machine_b from -> at_a_but_sshed_onto_b $ xhost + && export DISPLAY=:0 xeyes
) - решение, требующее прямого физического доступа к B
То, что я попробовал, это настроить (B) для запуска удаленных элементов X... если я ничего не забыл - с тех пор, как nmap -p6000 machine_B
вернулся, этот портзакрытои запускаем (из командной строки A):
A_machine $ env DISPLAY=B_machine:0 xeyes
где B_machine установлен, /etc/hosts
а также ~/.ssh/config
дает сбой.
Я подозреваю, что я полностью пропустил шаг с копированием X11волшебные_печеньяиз .Xauthority... но, может быть, этот шаг не нужен и есть более простой способ?
Редактировать: в ответ на вопрос @Rostislav Kandilarov - похоже, lightdm запускает X-сервер, но скоро я смогу это проверить, а также проверить, запускается ли он с --nolisten tcp
.
решение1
(Отредактировано, старый ответ ниже)
При наличии дополнительного требования, что вы хотите делать все это из A, не затрагивая B, проблема с запуском X-сервера на B и подключением к нему приложения на A заключается в том, что этот X-сервер будет использовать только устройства ввода (клавиатуру, мышь), подключенные к B. Поэтому для использования вашего приложения вам придется использовать эти устройства ввода, что вам не нужно.
В принципе, можно попробовать разделить устройства ввода с A, но тогда конструкция действительно становится запутанной...
ТакВНКявляетсямногов этой ситуации проще.
Настройте vnc4server
на A. Этот сервер также будет выступать в качестве X-сервера для приложений на A. Запустите xvnc4viewer
на A и используйте его для запуска и управления вашим приложением. Запустите другой vncviewer на B и подключите его к серверу на A, он отобразит приложение. Это может быть так же просто, как directvnc
(использовать кадровый буфер RaspPi напрямую, без дополнительных обходных путей через X, поэтому меньше нагрузки на RaspPi), или, если вы хотите продолжать работать с существующим X-сервером на B, другой xvnc4viewer
.
Самый простой способ — использовать удаленный рабочий стол, напримерВНК, скорее всего, уже доступен в виде пакета в вашем дистрибутиве. Обычно это работает намного лучше, чем пересылка X через ssh или иным образом, потому что это намного лучше сжимает и не использует примитивы X на проводе.
Конечно, есть также несколько способов настроить переадресацию X, через ssh или напрямую. Например, вы можете войти ssh -X
из B в A, запустить свое приложение на A и отобразить вывод на B. (Вы исключили обратное направление, но ничего не сказали об этом, так что я не совсем уверен, нужно ли вам это).
Вы также можете настроить X-сервер для удаленного сеанса черезXDMCP. Или заставьте одно приложение использовать удаленный X-сервер, используя соответствующие xauth
настройки DISPLAY
.
Но я бы все же рекомендовал сначала попробовать VNC.
решение2
Итак, если вы используете Raspbian OS на (B), и вы не делали никаких специальных настроек, как вы подозревали, вы, вероятно, используете lightdm.
Конечно, вам нужно указать lightdm, чтобы X-сервер слушал tcp (порт 6000). Вы делаете это, устанавливая xserver-allow-tcp=true
файл conf в разделе global [Seat:*]
. Вам также может потребоваться указать явно xserver-command=X -listen tcp
(посмотритездесь). Вы можете выбрать любой дополнительный файл в /etc/lightdm/lightdm.conf.d/*.conf
формате /etc/lightdm/lightdm.conf
.
Далее, если вас не слишком волнует безопасность, вам, вероятно, также понадобится запустить на (B) какую-то форму xhost +
команды, например xhost + IP_OF_(A)
. Если вас действительно волнуют уязвимости локальной сетиВы не должныиспользуйте X напрямую через TCP в первую очередь, но без SSH вы можете немного усложнить задачу, обменявшись MIT-MAGIC-COOKIE между (A) и (B), запустив (B) xauth extract - $DISPLAY | ssh (A) xauth merge -
.
Затем перезапустите lightdm service lightdm restart
или systemctl restart lightdm.service
в зависимости от версии вашей ОС.
Последнее - проверьте на (B), слушает ли Xorg на 6000netstat -antp | grep -F 6000