Pergunta

Estou tentando iniciar o vncviewer no Raspberry Pi usando PHP, onde RPi é o cliente e meu servidor VNC executa o MS Windows.

Em PHP estou usando esse script para iniciar o vncviewer

$cmd="echo password | vncviewer -autopass " .$ip;
shell_exec($cmd);

Funciona quando executo apenas o shell script do RPi, mas quando tento no PHP recebo este erro:

Error: Can't open display:

Existe alguma solução alternativa para esse erro?

Foi útil?

Solução

Se você estiver usando o X11, provavelmente precisará configurar seu DISPLAY variável.

Clientes X11 (programas) que precisam abrir janelas em um servidor X11 (display) usam esta variável para determinar onde o cliente deve encontrar o servidor.O modelo cliente/servidor é usado aqui porque o servidor fornece recursos de exibição de janela para o cliente.

X inclui a capacidade de exibir janelas em servidores remotos em uma rede, embora 99,9% do tempo você exiba coisas na tela principal da máquina que executa o programa, então normalmente, DISPLAY=localhost:0.0.

O problema é que se DISPLAY é não definido, um programa não sabe onde abrir suas janelas, mesmo se houver um servidor X rodando na mesma máquina.E quando os programas são executados por cron ou os scripts de inicialização do sistema ou qualquer coisa que não tenha sido iniciada pelo próprio X (incluindo um script PHP executado pelo seu servidor web), eles geralmente não têm DISPLAY definido para qualquer coisa.

Então ..como você observou nos comentários, definindo DISPLAY=:0 dirá ao vncviewer para onde enviar suas janelas.Esta é uma forma abreviada de DISPLAY=localhost:0.0.O nome do host, se excluído, será considerado localhost.E a .0 no final refere-se ao número da tela, cujo padrão também é zero.Confira a Documentação X para mais detalhes.

E como você também observou nos comentários, no ambiente onde o X está sendo executado (ou seja, DISPLAY já está definido), você pode precisar executar xhost + para permitir que programas não iniciados pelo X abram janelas.

Para definir uma variável de ambiente em PHP, use algo como:

putenv("DISPLAY=:0");

antes do código que inicia o VNC.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top