
Tenho máquina local (A) e Raspberry PI 3 (B).
B tem um monitor HDMI conectado e está executando o sistema operacional Raspbian.
Quero executar o aplicativo X em A - digamos, a apresentação do Libre Office Impress que tenho em A e torná-la visível (exibida) na tela conectada a B.
Quero fazer isso na frente da máquina A:
- não por
ssh -X to_A
de B, - nem usar VNC de B para obter saída de A
Eu não estou procurando:
- Executando o aplicativo X em B usando ssh de A e tendo sua saída exibida em A (isso pode ser feito por
from_a $ ssh -X machine_B
clientes rdp/remmina/vnc) - Executando o aplicativo X em B usando ssh de A e tendo sua saída exibida em B (isso pode ser feito exportando a exibição em ssh e configurando adequadamente o xhost, por exemplo
from_a $ ssh machine_b from -> at_a_but_sshed_onto_b $ xhost + && export DISPLAY=:0 xeyes
) - solução que requer acesso físico direto a B
O que eu tentei foi configurar (B) para executar itens X remotos... se não esqueci de nada - desde que nmap -p6000 machine_B
retornei essa porta éfechadoe executando (na linha de comando de A):
A_machine $ env DISPLAY=B_machine:0 xeyes
onde B_machine está configurado /etc/hosts
e também ~/.ssh/config
falha.
O que eu suspeito é que perdi totalmente a cópia do X11cookies_mágicosde .Xauthority...mas talvez esta etapa não seja necessária e exista uma maneira mais simples?
Editar: em resposta à pergunta de @Rostislav Kandilarov - parece que o lightdm inicia o servidor X, mas logo poderei verificar se é segunda-feira, bem como verificar se começa com --nolisten tcp
.
Responder1
(Editado, resposta antiga abaixo)
Com o requisito adicional de que você deseja fazer tudo isso de A, sem tocar em B, o problema de executar um servidor X em B e conectar-se a ele com um aplicativo em A é que esse servidor X usará apenas dispositivos de entrada (teclado, mouse ) conectado a B. Portanto, para usar seu aplicativo, você teria que usar esses dispositivos de entrada, o que você não deseja.
Em princípio você poderia tentar compartilhar os dispositivos de entrada de A, mas então a construção realmente começa a ficar bizantina...
EntãoVNCébastantemais fácil nesta situação.
Configure um vnc4server
em A. Este servidor também atuará como servidor X para aplicativos em A. Inicie um xvnc4viewer
em A e use-o para iniciar e controlar seu aplicativo. Inicie outro vncviewer em B e conecte-o ao servidor em A, ele exibirá o aplicativo. Pode ser tão simples quanto directvnc
(usar o framebuffer do RaspPi diretamente, sem desvio adicional sobre o X, portanto, menos carga de trabalho para o RaspPi) ou se você quiser continuar executando um servidor X existente em B, outro xvnc4viewer
.
A maneira mais fácil é usar uma área de trabalho remota comoVNC, provavelmente já disponível como pacote em sua distribuição. Isso geralmente funciona muito melhor do que o encaminhamento de X via ssh ou de outra forma, porque é muito melhor compactado e não usa primitivos X na conexão.
É claro que também existem várias maneiras de configurar o encaminhamento do X, por ssh ou diretamente. Por exemplo, você pode fazer login ssh -X
de B para A, executar seu aplicativo em A e exibir a saída em B. (Você descartou a direção inversa, mas não disse nada sobre esta, então não estou bem claro se você quiser isso).
Você também pode configurar o servidor X para uma sessão remota viaXDMCP. Ou faça com que um único aplicativo use um servidor X remoto usando as configurações xauth
e adequadas DISPLAY
.
Mas eu ainda recomendo tentar o VNC primeiro.
Responder2
Portanto, se você estiver usando o Raspbian OS em (B), se não tiver feito nenhuma personalização específica como suspeitava, provavelmente está usando lightdm .
Com certeza você precisa dizer ao lightdm para forçar o servidor X a ouvir o tcp (porta 6000). Você faz isso configurando xserver-allow-tcp=true
o arquivo conf na seção global [Seat:*]
. Você também pode precisar especificar explicitamente xserver-command=X -listen tcp
(dê uma olhadaaqui). A escolha é sua entre qualquer arquivo extra /etc/lightdm/lightdm.conf.d/*.conf
ou diretamente no formato /etc/lightdm/lightdm.conf
.
Em seguida, se você não se importa muito com a segurança, provavelmente também precisará executar em (B) alguma forma de xhost +
comando como xhost + IP_OF_(A)
. Se você se preocupa com vulnerabilidades de LANvocê não deveriause diretamente X sobre tcp em primeiro lugar, mas sem ssh você pode dar um pouco de dureza trocando um MIT-MAGIC-COOKIE entre (A) e (B) executando em (B) xauth extract - $DISPLAY | ssh (A) xauth merge -
.
Em seguida, reinicie o lightdm service lightdm restart
ou systemctl restart lightdm.service
dependendo da versão do seu sistema operacional.
Último - verifique em (B) se o Xorg está escutando em 6000netstat -antp | grep -F 6000