
Tengo una máquina local (A) y Raspberry PI 3 (B).
B tiene un monitor HDMI conectado y ejecuta el sistema operativo Raspbian.
Quiero ejecutar la aplicación X en A, digamos la presentación de Libre Office Impress que tengo en A, y hacerla visible (que se muestre) en la pantalla conectada a B.
Quiero hacerlo frente a la máquina A:
- no por
ssh -X to_A
de B, - ni usar VNC de B para obtener salida de A
No estoy buscando:
- Ejecutar la aplicación X en B usando ssh desde A y mostrar su salida en A (esto lo pueden hacer
from_a $ ssh -X machine_B
clientes rdp/remmina/vnc) - Ejecutar la aplicación X en B usando ssh desde A y mostrar su salida en B (esto se puede hacer exportando la visualización en ssh y la configuración adecuada de xhost, por ejemplo
from_a $ ssh machine_b from -> at_a_but_sshed_onto_b $ xhost + && export DISPLAY=:0 xeyes
) - solución que requiere acceso físico directo a B
Lo que intenté fue configurar (B) para ejecutar X elementos remotos... si no me he olvidado de nada, desde que nmap -p6000 machine_B
regresé, ese puerto escerradoy ejecutando (desde la línea de comando de A):
A_machine $ env DISPLAY=B_machine:0 xeyes
donde B_machine está configurado /etc/hosts
y ~/.ssh/config
falla.
Lo que sospecho es que me olvido por completo del paso de copiar X11.galletas_magicasde .Xauthority...pero tal vez este paso no sea necesario y hay una manera más sencilla.
Editar: en respuesta a la pregunta de @Rostislav Kandilarov: parecería que lightdm inicia el servidor X, pero lo más pronto posible podré comprobar que es lunes, además de verificar si comienza con --nolisten tcp
.
Respuesta1
(Respuesta antigua editada a continuación)
Con el requisito adicional de que desea hacer todo esto desde A, sin tocar B, el problema de ejecutar un servidor X en B y conectarse a él con una aplicación en A es que este servidor X solo usará dispositivos de entrada (teclado, mouse). ) conectado a B. Entonces, para usar su aplicación, tendría que usar estos dispositivos de entrada, que no desea.
En principio, podría intentar compartir los dispositivos de entrada de A, pero luego la construcción realmente comienza a volverse bizantina...
EntoncesVNCesmuchomás fácil en esta situación.
Configure a vnc4server
en A. Este servidor también actuará como servidor X para aplicaciones en A. Inicie a xvnc4viewer
en A y utilícelo para iniciar y controlar su aplicación. Inicie otro vncviewer en B y conéctelo al servidor en A, mostrará la aplicación. Puede ser tan simple como directvnc
(use el framebuffer de RaspPi directamente, sin desvíos adicionales sobre X, por lo que hay menos carga de trabajo para RaspPi), o si desea seguir ejecutando un servidor X existente en B, otro xvnc4viewer
.
La forma más sencilla es utilizar un escritorio remoto comoVNC, muy probablemente ya esté disponible como paquete en su distribución. Por lo general, eso funciona mucho mejor que el reenvío X a través de ssh o de otra manera, porque está mucho mejor comprimido y no usa primitivas X en el cable.
Por supuesto, también hay varias formas de configurar el reenvío X, a través de ssh o directamente. Por ejemplo, puede iniciar sesión ssh -X
de B a A, ejecutar su aplicación en A y mostrar el resultado en B. (Descartó la dirección inversa, pero no dijo nada sobre esta, por lo que no estoy del todo seguro). seguro si quieres eso).
También puede configurar el servidor X para una sesión remota a través deXDMCP. O haga que una sola aplicación utilice un servidor X remoto utilizando xauth
la DISPLAY
configuración adecuada.
Pero aun así recomendaría probar VNC primero.
Respuesta2
Entonces, si está utilizando el sistema operativo Raspbian en (B), si no ha realizado ninguna personalización específica como sospechaba, probablemente esté usando lightdm.
Seguramente necesita decirle a lightdm que permita que el servidor X escuche tcp (puerto 6000). Lo hace configurando xserver-allow-tcp=true
el archivo conf en la sección global [Seat:*]
. Es posible que también deba especificar explícitamente xserver-command=X -listen tcp
(eche un vistazoaquí). Es tu elección entre cualquier archivo extra en /etc/lightdm/lightdm.conf.d/*.conf
o directamente en /etc/lightdm/lightdm.conf
.
A continuación, si no le importa demasiado la seguridad, probablemente también necesitará ejecutar en (B) algún tipo de xhost +
comando como xhost + IP_OF_(A)
. Si le preocupan las vulnerabilidades de la LANusted no debeuse directamente X sobre tcp en primer lugar, pero sin ssh puede darle un poco de dureza al intercambio de una MIT-MAGIC-COOKIE entre (A) y (B) ejecutando en (B) xauth extract - $DISPLAY | ssh (A) xauth merge -
.
Luego reinicie lightdm service lightdm restart
o systemctl restart lightdm.service
según la versión de su sistema operativo.
Último: verifique (B) si Xorg está escuchando en 6000netstat -antp | grep -F 6000